如何等待承诺得到解决?

时间:2014-06-11 18:57:30

标签: javascript node.js promise q

我正在处理需要某个函数同步的NodeJs框架,但我需要检索一个只能异步访问的值。在一个完美的世界里,我能够回报一个承诺,但我做不到。

作为一个快速而肮脏的解决方案,我创建了以下方法:

exports.synchronizePromise = function(promise) {
    var value;
    promise.then(function(promiseValue) {
        value = promiseValue;
    });
    while (!value) {} // Wait for promise to resolve
    console.log("DONE: " + value); // Never reached
    return value;
};

但是我收到了一个错误。有没有办法完成我的需要?

3 个答案:

答案 0 :(得分:4)

鉴于该节点默认只有单线程,因此实际上并不是解决此问题的简单方法。虽然有一个。基于生成器/光纤,您可以向节点添加一种并发执行。基于此有一个waitfor implementation

答案 1 :(得分:3)

如果您有一个已解决的承诺,您可以使用inspect

取值
exports.synchronizePromise = function(promise) {
  var i = promise.inspect();
    if (i.state === "rejected") {
      throw i.reason;
    } else if (i.state === "fulfilled") {
      return i.value;
    } else {
      throw new Error("attempt to synchronize pending promise")
    }
};

但是,如果承诺未决,那么它实际上是异步的,那么你的问题就没有意义,而且函数会抛出错误。

答案 2 :(得分:-3)

Promise是异步的。它们代表未来价值 - 未来1毫秒,1分钟,1天或1年可用的价值,或永远不会。根据定义,除了时间机器之外,没有办法“强迫”它们解决。

如果您的上游逻辑建立在同步性的前提下,但无论出于何种原因,它依赖的东西现在都是异步的,您必须重构该上游组件以便异步操作。没有其他选择。

如果你的框架“需要某个函数同步”,当该函数不能或不能同步时,那么框架的设计很糟糕且无法使用,或者至少不能用于你的问题。