如何等待承诺解决?

我正在处理一个NodeJs框架,要求某个function是同步的,但我需要检索一个只能asynchronous访问的值。 在一个完美的世界里,我可以回报一个承诺,但是我不能。

作为一个快速和肮脏的解决scheme,我创build了以下方法:

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; }; 

但是我得到一个错误。 有什么办法来完成我所需要的?

鉴于该节点默认情况下只有单线程,并不是一个简单的方法来解决这个问题。 有一个虽然。 根据发生器/光纤,您可以向节点添加一种并发执行。 基于此,有一个waitfor实现 。

在Q方面,如果你有一个承诺的解决scheme,你可以只考虑价值

 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") } }; 

但是,如果承诺是挂起的,它是真正的asynchronous,你的问题没有意义,function会抛出一个错误。

承诺是asynchronous的。 它们代表未来的价值 – 在1ms,1分钟,1天或1年后的价值,或从未。 根据定义,没有办法“强制”他们解决,除了时间机器。

如果你有上游逻辑build立在同步的前提下,但是无论出于什么原因它所依赖的东西现在都是asynchronous的,你必须重构上游组件以asynchronous操作。 没有其他的select。

如果你的框架“需要一个特定的函数是同步的”,当这个函数不是或者不能同步的时候,那么这个框架devise不好,不可用,或者至less不能用于你的问题。