Refactored out nextTick/setImmediate for better error handling

This commit is contained in:
Patrick Steele-Idem 2017-04-12 20:27:59 -06:00
parent 57f73838af
commit 6f89fe04ea
5 changed files with 55 additions and 46 deletions

View File

@ -4,32 +4,7 @@ var updatesScheduled = false;
var batchStack = []; // A stack of batched updates
var unbatchedQueue = []; // Used for scheduled batched updates
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;
}
}
var nextTick = require('../runtime/nextTick');
/**
* This function is called when we schedule the update of "unbatched"
@ -57,7 +32,7 @@ function scheduleUpdates() {
updatesScheduled = true;
setImmediate(updateUnbatchedComponents);
nextTick(updateUnbatchedComponents);
}
function updateComponents(queue) {
@ -129,4 +104,4 @@ function queueComponentUpdate(component) {
}
exports.$__queueComponentUpdate = queueComponentUpdate;
exports.$__batchUpdate = batchUpdate;
exports.$__batchUpdate = batchUpdate;

View 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
View File

@ -0,0 +1 @@
module.exports = process.nextTick;

View File

@ -1,6 +1,7 @@
{
"browser": {
"./loader/index.js": "./loader/index-browser.js",
"./nextTick": "./nextTick-browser.js",
"./env-init.js": false
}
}
}

View File

@ -3,32 +3,30 @@
var logger = require('raptor-logging').logger(module);
var AsyncValue = require('raptor-async/AsyncValue');
var isClientReorderSupported = require('./client-reorder').isSupported;
var nextTick = require('../../runtime/nextTick');
function isPromise(o) {
return o && typeof o.then === 'function';
}
function safeRenderBody(renderBody, targetOut, data) {
try {
renderBody(targetOut, data);
} catch(err) {
return err;
}
}
function promiseToCallback(promise, callback, thisObj) {
if (callback) {
var finalPromise = promise
.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) {
finalPromise.done();
}
@ -116,8 +114,12 @@ module.exports = function awaitTag(input, out) {
} else if (renderTimeout) {
renderTimeout(targetOut);
} else {
if (input.renderBody) {
input.renderBody(targetOut, data);
var renderBodyFunc = input.renderBody;
if (renderBodyFunc) {
var renderBodyErr = safeRenderBody(renderBodyFunc, targetOut, data);
if (renderBodyErr) {
return renderBody(renderBodyErr);
}
}
}