我正在处理需要某个函数同步的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;
};
但是我收到了一个错误。有没有办法完成我的需要?
答案 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年可用的价值,或永远不会。根据定义,除了时间机器之外,没有办法“强迫”它们解决。
如果您的上游逻辑建立在同步性的前提下,但无论出于何种原因,它依赖的东西现在都是异步的,您必须重构该上游组件以便异步操作。没有其他选择。
如果你的框架“需要某个函数同步”,当该函数不能或不能同步时,那么框架的设计很糟糕且无法使用,或者至少不能用于你的问题。