我有一個承諾,可以解決或拒絕。我想在這些情況下做一些具體的事情,然後繼續解決諾言鏈(基本上我想「抓住」被拒絕的諾言,做點什麼,然後繼續解決)。延遲jQuery繼續解決失敗處理程序後
這裏有一個功能性片段,顯示我運行到這個問題:
var def = $.Deferred();
def.then(
function() {
console.log('first success handler');
},
function() {
console.log('first fail handler');
return $.Deferred().resolve();
}
);
def.then(
function() {
console.log('second success handler');
},
function() {
console.log('second fail handler');
}
);
def.done(function() {
console.log('done handler');
});
def.reject();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
預期結果:
first fail handler
second success handler
done handler
當前的結果:
first fail handler
second fail handler
據jQuery的文檔:
在jQuery 1.8中,deferred.then()方法返回一個新的承諾 可以過濾狀態和的值通過 功能遞延[...]。這些過濾器函數可以返回一個新值,傳遞給promise的.done()或.fail()回調函數,或者它們可以返回另一個可觀察對象(Deferred,Promise等),其中 將通過其解析/拒絕狀態和價值承諾的 回調。
所以我不知道爲什麼這不起作用。我期望在第一個失敗處理程序中返回已解決的承諾,以允許承諾鏈的其餘部分繼續解析。
這是一個已知的bug。請參閱: http://stackoverflow.com/questions/31962655/recovering-from-rejected-promises-in-js – baohouse