1

次の例のように、promise を連鎖できることはわかっています。

// we also have deferA, deferB and deferC as the corresponding defer objects
promiseB = promiseA.then(function(result) {
    // do stuff to resolve B
});

promiseC = promiseB.then(function(result) {
    // do stuff to resolve C
});

deferA.resolve(data)this will resolveを呼び出すとpromiseA、そのthenメソッドが実行され、promiseB解決されます。最後に promiseBthenが実行され、解決されますpromiseC。フラットでシンプルです(これが正しいことを願っています)。

しかし、Promise がそれ自体に連鎖するとどうなるでしょうか?

上記の例を次のように変更すると:

// we also have deferA and deferB as the corresponding defer objects
promiseA = promiseA.then(function(result) {
    // do stuff to...?
});

promiseB = promiseA.then(function(result) {
    // do stuff to resolve B
});

deferA.resolve(data);

さてどうなる?実行順序は?

さらに、これはどうですか:

// we also have deferA and deferB as the corresponding defer objects
promiseA = promiseA.then(function(result) {
    // do stuff to...?
});

deferA.resolve(data);

promiseB = promiseA.then(function(result) {
    // do stuff to resolve B
});

この場合はどうなりますか?

4

1 に答える 1

5

これは promise に関するものではなく、JavaScript での参照に関するものです。

あなたがするとき:

p = p.then(function(){...

参照しているプロミスを変更してpいますが、遅延オブジェクトがフルフィル/拒否したときに解決されるプロミスは変更していません。これはp、再割り当てする前と同じです。だからあなたのコード例では:

promiseA = promiseA.then(function(result) { // THIS WILL EXECUTE FIRST
    // do stuff to...?
});

promiseB = promiseA.then(function(result) { // THIS WILL EXECUTE SECOND
    // do stuff to resolve B
});

deferA.resolve(data);

.then次のように、promise に複数のハンドラーをアタッチする場合:

var p = first.then(...

var p2 = first.then(...

ここでは Promises/A+ の実装を想定しています。.thenこの仕様は、満たされたときに両方のハンドラーが実行されることを保証しますfirst。追加された順序で常に発生します。

したがって、上記の場合:

  • 最初の promiseA は解決します
  • 次に、上の promiseA.then が実行されます (最初に追加されたもの)。
  • 次に、一番下の promiseA.then が実行されます (後で追加されたもの)。

追加の前または後に deferred を解決しても.then、結果が大きく変わることはありません (トリビア: これは、大きな問題である jQuery promise には当てはまりません)。


ただし、循環プロミス チェーンを作成することは可能ですが、少し難しくなります。無限ループを作成できるように。良い約束のライブラリは、それを実行するか、循環参照エラーをスローします。

于 2014-07-11T22:33:06.430 に答える