我知道JS是一个单线程环境,但是有一种方法可以创建一个等待'阻止Q.js承诺的函数,直到值被兑换?
当然,以下代码将以无限循环结束。 由于' while',' setTimeout'永远不会调用回调,并且“已实现”回拨'函数总是返回' false'值。
var d = Q.defer();
window.setTimeout(function() {
d.resolve(true);
}, 1000);
await(d.promise);
function await(p) {
var value = undefined;
while(value == undefined) {
if(p.isFulfilled()) {
return p.inspect().value;
}
}
}
答案 0 :(得分:2)
是的,您可以使用Q.async
收益。请注意,它只会阻止当前链。此外,它需要发电机支持,因此它只能在旗下的NodeJS中工作,或者使用跟踪器ES6->。 ES3 / 5编译器,因为它使用新的语言功能:
Q.async(function* (){
console.log("Hello");
var value = yield (new Q.Promise(function(r){ setTimeout(r,1000); }));
// alternatively, and more correctly: var value = Q(true).delay(1000);
console.log("World"); // will log one second later.
});
yield
关键字用作await
,在ES7中,async / await最终会在JavaScript中支持语言。
值得一提的是,像Bluebird这样的更好/更新的承诺库实现生成器的速度要快得多,事实上快得多 - that they even beat callbacks in performance.