$.when()
遅延操作の 1 つが成功しない場合に使用すると、予期しない結果が得られます。
2 つの deferred を作成したこの JavaScript を見てください。1 つ目は成功し、2 つ目は失敗します。
var f1 = function() {
return $.Deferred(function(dfd) {
dfd.resolve('123 from f1');
}).promise();
};
var f2 = function() {
return $.Deferred(function(dfd) {
dfd.reject('456 from f2');
}).promise();
};
$.when(f1(), f2())
.then(function(f1Val, f2Val) {
alert('success! f1, f2: ' + JSON.stringify([f1Val, f2Val]));
})
.fail(function(f1Val, f2Val) {
alert('fail! f1, f2: ' + JSON.stringify([f1Val, f2Val]));
});
自分で実行してください: http://jsfiddle.net/r2d3j/2/
私は得るfail! f1, f2: ["456 from f2", null]
問題は、.fail()
コールバックで、拒否で渡された値がf2()
最初の引数にルーティングされていることf1Value
です。つまり、どの遅延オブジェクトが実際にそれを投稿したかを知る方法が実際にはありません。reject()
また、失敗データが実際にどの操作に属しているかもわかりません。
最初の deferred が失敗しなかったので、.fail()
引数を取得すると予想していました。null, '456 from f2'
それとも、ここで遅延処理を正しく行っていないだけですか?
コールバックの引数の順序が守られていない場合、失敗した deferred と、どの拒否引数が失敗した deferred に属しているかを知るにはどうすればよいですか?