1

私のプロジェクトには、延期されたプロミスを返す複数の API を使用するワークフローが含まれています。jQuery 1.8を使用しています

.done()との違いは、新しい約束.then().then()返すことだと理解しています。私の例では、最初の deferred が拒否された場合.fail()、2 番目のハンドラーが新しい promise にチェーンされているため、最初のハンドラーのみが実行されると予想されます。実行時には、両方の失敗ハンドラが実行されます。

var firstDeferred = $.Deferred(), secondDeferred = $.Deferred();

firstDeferred.promise()
.fail(function (error) {
    console.log(error);
})
.then(function () {
    return secondDeferred.promise();
})
.fail(function (error) {
    console.log(error);
});

firstDeferred.reject('first deferred object');
//secondDeferred.reject('second deferred object');

私の期待される結果:

> first deferred object

実結果:

> first deferred object
> first deferred object

両方の.fail()ハンドラーが呼び出されるのはなぜですか? 特定の延期された promise が拒否された場合にのみハンドラーが呼び出されるようにワークフローを構築するにはどうすればよいですか?

4

2 に答える 2

4

then()そのコールバックが実行されることはないため、コールバックで返すプロミスには何も連鎖していません。

then()次の引数を取ります。

then( doneFilter , failFilter )

コールバックは最初の引数であるため、doneFilter. しかし、最初の約束は失敗したためthen()、コールバックを呼び出しません。を呼び出しますがfailFilterその 2 番目の引数には何も渡しません。

ドキュメントからの引用:

使用されたフィルター関数が null であるか指定されていない場合、promise は元の値と同じ値で解決または拒否されます。

failFilter引数が指定されていないためthen()、最初の promise の状態を転送するだけで、2 番目のfail()ハンドラーがトリガーされます。

これは機能します:

var firstDeferred  = $.Deferred(),
    secondDeferred = $.Deferred();

firstDeferred.promise()
.fail(function (error) {
    console.log(error);
})
.then(null, function () { // Notice the null
    return secondDeferred.promise();
})
.fail(function (error) {
    console.log(error);
});

firstDeferred.reject('first deferred object');
secondDeferred.reject('second deferred object');

ログ:

first deferred object
second deferred object 
于 2013-04-19T19:07:34.693 に答える
1

これはthen、新しい promise を返すために発生します (その結果は、コールバックによって返された promise の結果にパイプされます)。

プロミスには、解決済みまたは失敗の 2 つの最終状態があります。したがって、最初の deferred が失敗したため、2 番目は決して解決できないため、失敗します。then失敗を泡立てていなかったとしたら、無期限に保留中の約束をしていることに気づきました。これは、メモリ リークのリスクになる可能性があります。

then実際に実行された場合にのみ実行したい場合は、fail 関数の管理方法を変更しました。

于 2013-04-19T19:07:22.397 に答える