我们如何在Duktape之上使用承诺?
我的场景:将在Web浏览器上加载的客户端javascript代码迁移到Duktape。我正在使用Dukluv(与Duktape和libuv库绑定)二进制文件来运行JavaScript。但是我的javascript取决于 BlueBird库。
当我尝试执行时出现错误:
no async scheduler available
问题出在bluebird的schedule.js第33行。代码如下:
else if ((typeof MutationObserver !== "undefined" &&
(_MutationObserver = MutationObserver)) ||
(typeof WebKitMutationObserver !== "undefined" &&
(_MutationObserver = WebKitMutationObserver))) {
schedule = (function() {
var div = document.createElement("div");
var queuedFn = void 0;
var observer = new _MutationObserver(
function Promise$_Scheduler() {
var fn = queuedFn;
queuedFn = void 0;
fn();
}
);
observer.observe(div, {
attributes: true
});
return function Promise$_Scheduler(fn) {
queuedFn = fn;
div.classList.toggle("foo");
};
})();
}
没有webkitmutationobserver也没有文档对象,因为我在没有任何浏览器的情况下在Dukluv上运行我的脚本。
我也尝试使用 Q库,即使我收到错误setTimeout not defined
。如果可能的话,请为我提供一些解决方案。感谢
答案 0 :(得分:1)
Bluebird允许您准确地为这些场景明确设置调度程序。你需要告诉蓝鸟如何直接执行一个函数:
Promise.setScheduler(function(fn){ // fn is what to execute
var timer = uv.new_timer.call({});
uv.timer_start(timer, 0, 0, fn); // add the function as a callback to the timer
});
在您的所有承诺代码上方执行此操作 - 这将解决上述错误。