web-dev-qa-db-ja.com

約束が解決されるのを待つ方法は?

特定の関数を同期させる必要がある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;
};

しかし、エラーが発生します。必要なことを達成する方法はありますか?

33
sinθ

デフォルトでは、ノードはシングルスレッドのみであるため、これを解決する簡単な方法はありません。ただし、1つあります。ジェネレーター/ファイバーに基づいて、ノードに一種の同時実行を追加できます。 waitfor実装 がそれに基づいています。

4
tcurdt

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

ただし、約束が保留中の場合、それは本当に非同期であり、質問は意味をなさず、関数はエラーをスローします。

3
Esailija