特定の関数を同期させる必要がある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;
};
しかし、エラーが発生します。必要なことを達成する方法はありますか?
デフォルトでは、ノードはシングルスレッドのみであるため、これを解決する簡単な方法はありません。ただし、1つあります。ジェネレーター/ファイバーに基づいて、ノードに一種の同時実行を追加できます。 waitfor
実装 がそれに基づいています。
Qで解決済みの約束がある場合は、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")
}
};
ただし、約束が保留中の場合、それは本当に非同期であり、質問は意味をなさず、関数はエラーをスローします。