无论如何在javascript中创建一个'await'函数阻止Q.js承诺,直到值被兑换?

时间:2014-05-26 12:23:25

标签: javascript promise q

我知道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;
        }
    }
}

1 个答案:

答案 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.