2016-06-29 2 views
0

jQueryの約束をしていると、私は困っていました。 .then()関数を使用して一連の約束を解決した後、コードを実行しようとしました。しかし、約束の1つが拒​​否されたときには決してうまくいかなかった。私の約束が解決されるとき、それは、その後のコールバック関数を実行する必要があります/拒否の両方のケースで、どうやらjQueryの相違点は、いつでも遅れて

Then: Description: Add handlers to be called when the Deferred object 
     is resolved, rejected, or still in progress. 

Always: Description: Add handlers to be called when the Deferred 
     object is either resolved or rejected. 

:私は、公式ドキュメントを見れば、私はこれを見つける

(といつも一緒()関数は動作します)常に、しかしそれはdoesntです。

誰かがこの現象を説明できますか?ここで

fiddle

はあなたのすべてに感謝です!

答えて

1
it should execute the callback functions of then and always, but it doesnt. 

最初の例では、拒否された約束を処理する機能はありません。拒否された約束rjct.reject()

var rslv = $.Deferred(); 
 
var rjct = $.Deferred(); 
 

 
var promises = []; 
 
promises.push(rslv); 
 
promises.push(rjct); 
 

 
$.when.apply(null, promises).then(function(res) { 
 
    alert("not finished"); 
 
} 
 
// handle rejected promise 
 
, function(reason) { 
 
    alert("handle " + reason); 
 
}); 
 
rslv.resolve("123"); 
 
rjct.reject("rejected promise"); 
 

 
var rslv2 = $.Deferred(); 
 
var rjct2 = $.Deferred(); 
 

 
var promises2 = []; 
 
promises2.push(rslv2); 
 
promises2.push(rjct2); 
 

 
$.when.apply(null, promises).always(function(res) { 
 
    alert("finished"); 
 
}); 
 
rslv2.resolve(); 
 
rjct2.resolve();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

を処理するため .then().then()またはinclude二番目のパラメータにチェーン .fail().always()を追加