mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Refactored out nextTick/setImmediate for better error handling
This commit is contained in:
parent
57f73838af
commit
6f89fe04ea
@ -4,32 +4,7 @@ var updatesScheduled = false;
|
|||||||
var batchStack = []; // A stack of batched updates
|
var batchStack = []; // A stack of batched updates
|
||||||
var unbatchedQueue = []; // Used for scheduled batched updates
|
var unbatchedQueue = []; // Used for scheduled batched updates
|
||||||
|
|
||||||
var win = window;
|
var nextTick = require('../runtime/nextTick');
|
||||||
var setImmediate = win.setImmediate;
|
|
||||||
|
|
||||||
if (!setImmediate) {
|
|
||||||
if (win.postMessage) {
|
|
||||||
var queue = [];
|
|
||||||
var messageName = 'si';
|
|
||||||
win.addEventListener('message', function (event) {
|
|
||||||
var source = event.source;
|
|
||||||
if (source == win || !source && event.data === messageName) {
|
|
||||||
event.stopPropagation();
|
|
||||||
if (queue.length > 0) {
|
|
||||||
var fn = queue.shift();
|
|
||||||
fn();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, true);
|
|
||||||
|
|
||||||
setImmediate = function(fn) {
|
|
||||||
queue.push(fn);
|
|
||||||
win.postMessage(messageName, '*');
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
setImmediate = setTimeout;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function is called when we schedule the update of "unbatched"
|
* This function is called when we schedule the update of "unbatched"
|
||||||
@ -57,7 +32,7 @@ function scheduleUpdates() {
|
|||||||
|
|
||||||
updatesScheduled = true;
|
updatesScheduled = true;
|
||||||
|
|
||||||
setImmediate(updateUnbatchedComponents);
|
nextTick(updateUnbatchedComponents);
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateComponents(queue) {
|
function updateComponents(queue) {
|
||||||
@ -129,4 +104,4 @@ function queueComponentUpdate(component) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
exports.$__queueComponentUpdate = queueComponentUpdate;
|
exports.$__queueComponentUpdate = queueComponentUpdate;
|
||||||
exports.$__batchUpdate = batchUpdate;
|
exports.$__batchUpdate = batchUpdate;
|
||||||
|
|||||||
30
runtime/nextTick-browser.js
Normal file
30
runtime/nextTick-browser.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/* globals window */
|
||||||
|
|
||||||
|
var win = window;
|
||||||
|
var setImmediate = win.setImmediate;
|
||||||
|
|
||||||
|
if (!setImmediate) {
|
||||||
|
if (win.postMessage) {
|
||||||
|
var queue = [];
|
||||||
|
var messageName = 'si';
|
||||||
|
win.addEventListener('message', function (event) {
|
||||||
|
var source = event.source;
|
||||||
|
if (source == win || !source && event.data === messageName) {
|
||||||
|
event.stopPropagation();
|
||||||
|
if (queue.length > 0) {
|
||||||
|
var fn = queue.shift();
|
||||||
|
fn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, true);
|
||||||
|
|
||||||
|
setImmediate = function(fn) {
|
||||||
|
queue.push(fn);
|
||||||
|
win.postMessage(messageName, '*');
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
setImmediate = setTimeout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = setImmediate;
|
||||||
1
runtime/nextTick.js
Normal file
1
runtime/nextTick.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
module.exports = process.nextTick;
|
||||||
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"browser": {
|
"browser": {
|
||||||
"./loader/index.js": "./loader/index-browser.js",
|
"./loader/index.js": "./loader/index-browser.js",
|
||||||
|
"./nextTick": "./nextTick-browser.js",
|
||||||
"./env-init.js": false
|
"./env-init.js": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,32 +3,30 @@
|
|||||||
var logger = require('raptor-logging').logger(module);
|
var logger = require('raptor-logging').logger(module);
|
||||||
var AsyncValue = require('raptor-async/AsyncValue');
|
var AsyncValue = require('raptor-async/AsyncValue');
|
||||||
var isClientReorderSupported = require('./client-reorder').isSupported;
|
var isClientReorderSupported = require('./client-reorder').isSupported;
|
||||||
|
var nextTick = require('../../runtime/nextTick');
|
||||||
|
|
||||||
function isPromise(o) {
|
function isPromise(o) {
|
||||||
return o && typeof o.then === 'function';
|
return o && typeof o.then === 'function';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function safeRenderBody(renderBody, targetOut, data) {
|
||||||
|
try {
|
||||||
|
renderBody(targetOut, data);
|
||||||
|
} catch(err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function promiseToCallback(promise, callback, thisObj) {
|
function promiseToCallback(promise, callback, thisObj) {
|
||||||
if (callback) {
|
if (callback) {
|
||||||
var finalPromise = promise
|
var finalPromise = promise
|
||||||
.then(function(data) {
|
.then(function(data) {
|
||||||
callback(null, data);
|
nextTick(callback.bind(this, null, data));
|
||||||
|
})
|
||||||
|
.then(null, function(err) {
|
||||||
|
nextTick(callback.bind(this, err));
|
||||||
});
|
});
|
||||||
|
|
||||||
if (typeof promise.catch === 'function') {
|
|
||||||
finalPromise = finalPromise.catch(function(err) {
|
|
||||||
callback(err);
|
|
||||||
});
|
|
||||||
} else if (typeof promise.fail === 'function') {
|
|
||||||
finalPromise = finalPromise.fail(function(err) {
|
|
||||||
callback(err);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
finalPromise = finalPromise.then(null, function(err) {
|
|
||||||
callback(err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (finalPromise.done) {
|
if (finalPromise.done) {
|
||||||
finalPromise.done();
|
finalPromise.done();
|
||||||
}
|
}
|
||||||
@ -116,8 +114,12 @@ module.exports = function awaitTag(input, out) {
|
|||||||
} else if (renderTimeout) {
|
} else if (renderTimeout) {
|
||||||
renderTimeout(targetOut);
|
renderTimeout(targetOut);
|
||||||
} else {
|
} else {
|
||||||
if (input.renderBody) {
|
var renderBodyFunc = input.renderBody;
|
||||||
input.renderBody(targetOut, data);
|
if (renderBodyFunc) {
|
||||||
|
var renderBodyErr = safeRenderBody(renderBodyFunc, targetOut, data);
|
||||||
|
if (renderBodyErr) {
|
||||||
|
return renderBody(renderBodyErr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user