雖然標題是promise.all 但實際是遇到$.Differed() 和$.when的問題,不過我查了一下行為,其實他們做的事情是一樣的。
今天的情況:
我有好多個非同步事件,裡面可能成功可能失敗,但我不論成功或失敗都要做一件事情。而且我這些非同步事件都一定要被執行到
聽完這個敘述,會很直接地想到要用when + always (或是 all + finally ) 對吧?
但是!!!!! 這時候想的不同的事情來了
使用$.when 或是 promise.all 要注意一點,只要其中一個失敗,後面的就也會當成失敗,不會等到後面的東西做完。
也就是說 你有promise1, promise2, promise3 這時2失敗了 那他就會直接算3也失敗,不會做3裡面的東西。
解決方式:
[jQuery Deferred - waiting for multiple AJAX requests to finish - Stack Overflow](https://stackoverflow.com/questions/6538470/jquery-deferred-waiting-for-multiple-ajax-requests-to-finish)
參考這篇的做法可以解決這個窘境,既然他有任何一個會fail就會直接出去,不做剩下的promise
那不如我就讓所有人都會success不就好了嗎?
// just wrap deferred promises = $.map(promises, function(p) { var dfd = $.Deferred(); p.always(function() { dfd.resolve(); }); return dfd.promise(); }); |
沒錯 事情就是這麼簡單,你的那些promise的外面 再包一層promise讓他做完他自己的任何事情,之後會resolve就好了
非同步小筆記:
- 在debug的時候最好使用console.log去確認執行順序,
如果下斷點可能會導致有額外的時間處理非同步的事情,
導致在正式情況可能會有意外情境發生。
- jQuery的Differed物件,只要碰到 resolve或是 reject 就會馬上跳出,去做外面的done或fail或always