iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
0
Modern Web

30天入門JavaScript系列 第 28

【Day 28】callback hell跟callback問題

  • 分享至 

  • xImage
  •  



比較沒接觸過的東西有點難寫,在斷賽邊緣反覆試探/images/emoticon/emoticon46.gif




昨天提到,我們無法控制非同步函式回傳的時間,但如果我們要作一連串的操作時,
後面的操作需要前面的回傳資料,這時候需要利用我們回呼(callback)來實作。


用setTimeout()當作例子,我們想要在印出1的一秒後印出2然後一秒後3 然後4 然後5

setTimeout(function () {
  console.log(1);
  setTimeout(function () {
    console.log(2);
    setTimeout(function () {
      console.log(3);
      setTimeout(function () {
        console.log(4);
        setTimeout(function () {
          console.log(5);
        }, 1000);
      }, 1000);
    }, 1000);
  }, 1000);
}, 1000);


人的閱讀順序是從上到下的,但這種callback的巢狀結構非常難閱讀,
這種巢狀結構叫做回呼地獄(callback hell) 特色是縮排造成的三角形

另外上面已經是很簡單的例子了,只有5個計時器沒有另外的程式碼
假設今天要使用的是外部API呢?


再來個例子,今天想要作一個代訂外國書的網站,使用者選取書之後要呼叫外部匯率API,
呈現價格確定結帳後呼叫刷卡API,確定扣款成功後在顯示購買成功,
然後為了怕外部API有問題,要確定匯率是否正確的檢查,防止重複扣款,另外還有API無回應時的應對。

全部都用上面那種巢狀回呼來寫。



https://ithelp.ithome.com.tw/upload/images/20200928/201298364krPfp4cpb.jpg

總結一下callback的問題:

  • 巢狀結構難以閱讀跟維護
  • 無法確定外部的API會正確的使用callback
  • 如果要加入錯誤跟例外處理,程式碼又更難閱讀了

幸好ES6新增了Promise可以有效改善callback的問題,明天最後一篇就來要寫Promise~


上一篇
【Day 27】 setTimeout()跟非同步
下一篇
【Day 29】Promise
系列文
30天入門JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言