iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
自我挑戰組

JS 加強筆記系列 第 14

Day 14:promise 常見問題

  • 分享至 

  • xImage
  •  

這是 MDN 上面的常見錯誤範例,當中包含幾個錯,算是前面幾篇的統整:

/* 錯誤示範 */
doSomething()
    .then(function (result) {
        doSomethingElse(result).then((newResult) => doThirdThing(newResult));
    })
    .then(() => doFourthThing());

第一個問題是在 doSomethingElse 使用了 promise 卻沒有回傳,導致鏈接斷掉。在這樣的情況下,doFourthThingdoSomethingElse/ doThirdThing 會像兩條獨立的鏈接同時並行,造成非預期結果。

除了上述問題,非必要的巢狀結構也容易造成錯誤漏接。然後當然就是要鏈接中加上錯誤處理。

改寫:

doSomething()
  .then((result) => doSomethingElse(result))
  .then((newResult) => doThirdThing(newResult))
  .then(() => doFourthThing()) // 不一定要操作前面回傳的結果 可以只是接著處理別的事情 
  .catch((error) => console.error(error));

除此之外,async/ await 也是一種解決方案,後面會寫到。

這幾天蠻頻繁寫到巢狀的問題,雖然理論上可以理解,但總覺得平常很多時候結構並沒有寫的很平,所以用力思考了一下實務中的情境。我覺得應該可以說,「執行不同非同步任務」時不建議巢狀,因為這樣確實會不太靈活、不好抓錯。但單純就「串聯 then」這件事而言,蠻常會因為要統一整理資料或更新共同的 store 而將一部分 thencatch 接在內層。這部分可能再想想。


上一篇
Day 13:題外推書《Blood, Sweat, and Pixels》
下一篇
Day 15:promise 常見問題之 promise constructor anti-pattern
系列文
JS 加強筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言