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 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;
|
||||
|
||||
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": {
|
||||
"./loader/index.js": "./loader/index-browser.js",
|
||||
"./nextTick": "./nextTick-browser.js",
|
||||
"./env-init.js": false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user