1

ドキュメンテーションに拒否する必要があると書かれているのに、なぜ約束が果たされているのかを理解するのに苦労しています。

http://jsbin.com/orifok/5/editを開き、[go] ボタンをクリックすると、「失敗」と警告するはずのときに「OK」と警告されます。

と置き換えるwhen221.all...deferred2.promise.then(stepFulfilled, stepRejected);拒否が発生します。

require.js ライブラリへの依存を必要とするのではなく、when.js コードを変更して when221 変数をグローバルにしました (元のhttps://github.comと比較したhttp://pastebin.com/J8wCqjWMを参照)。 /cujojs/when/blob/2.2.1/when.js )。

when.all() ドキュメントには次のように書かれています: 約束のいずれかが拒否された場合、返された約束は拒否された最初の約束の拒否理由で拒否されます - https://github.com/cujojs/when/blob/masterを参照してください/docs/api.md#whenall

4

1 に答える 1

1

tl;dr: when.all は deferred ではなく promise を渡す必要があり、プログラマーはその間違いをしないように細心の注意を払う必要があります。

ブライアン・キャバリエはここでこれに答えました: https://github.com/cujojs/when/issues/172そして修正されたコードはここにあります: http://jsbin.com/orifok/10/edit

答えは次のとおりです。

こんにちは、サンプル コードは遅延オブジェクトを when.all に渡します。遅延オブジェクトは約束ではありません。残念ながら、jQuery などの一部のライブラリや、以前のバージョンの when.js では、promise と deferred オブジェクトが混同されています。明確にするために、私は最近、遅延オブジェクトを単純に {resolver, promise} のペアと呼ぶようになりました。when.all には、遅延オブジェクトではなく、promise を渡す必要があります。

期待どおりに動作する例の改訂版を次に示します。

(function(){
var deferred1 = when221.defer();
var deferred2 = when221.defer();

window.clickgo = function() {
  // Pass the promise, not the deferred
  when221.all([deferred1.promise, deferred2.promise]).then(stepFulfilled, stepRejected);
  deferred2.reject('foooo');
};

function stepFulfilled() {
    alert('ok');
}

function stepRejected(failed) {
    alert('failed ' + failed);
}

})();

また、when,js >= 2.2.0 には、新しい軽量の promise 作成 API when.promise があることにも注意してください。それらはさまざまな状況に適していますが、ほとんどの場合、私はそれを好むことがわかりました.

それが役立つことを願っています!

于 2013-07-24T02:45:22.617 に答える