前往
大廳
主題

promise.all 有一個失敗就不會往下做其他promise了,如何無痛讓promise做事 - promise.all的陷阱

多古尼爾拉布拉布拉格 | 2024-04-13 22:47:11 | 巴幣 2 | 人氣 54

雖然標題是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

創作回應

多古尼爾拉布拉布拉格
異音大大的無痛讓Js同步幫我很大,這篇算有點致敬w,然後我真的該開個技術blog,不然我每次有新的發現我都放在notion沒發出來
2024-04-13 23:12:49
多古尼爾拉布拉布拉格
其實我還寫了react教學,在部門內技術交換的時候寫的,不過我覺得還是沒有從hook開始讓你的網頁react起來寫得完美,現在也沒那麼大的原動力讓我去在幾天內學會react了XDDD
2024-04-13 23:14:32

更多創作