天天看點

JavaScript異步程式設計3——Promise的鍊式使用

通過promise的鍊式使用,避免回調地獄。

目錄

概述

詳論

回調地獄

promise實作

參考

????概述

在上一篇文章《javascript異步程式設計2——結合xmlhttprequest使用promise》中,簡要介紹了ajax與promise的結合使用。這樣,我們就有了兩個異步操作的例子:讀取一個json檔案;通過一個位址加載圖像。考慮一下,如果存在兩個異步操作,它們需要在執行一個操作之後再執行另外一個操作(例如在這裡,我們把圖像位址存儲在json檔案中,通過通路json中的位址來加載圖像),該如何做呢?

????詳論

為了實作上面說到的功能,假如我們不使用promise,直接使用回調函數當然也可以實作:

可以看到這裡我們使用了兩層的嵌套回調,加載圖像的異步操作在xmlhttprequest通路請求的響應回調中實作,這樣可以讓通路json請求結束了之後立刻去通路圖像操作。那麼更進一步來假設,需要加入一個行為,在加載圖像完成之後再進行操作呢(例如進行圖像處理)?這樣的話我們就得再加一層回調函數的嵌套。這樣,程式由上至下,由前往後的順序就會變成由外而内——最直覺的不便就是,"{}"層級變得多了,程式會變得難以閱讀——而這,就是所謂的“回調地獄”了。

為了解決“回調地獄”的問題,promise應運而生。在之前的文章中說過,promise的目的,是希望異步行為能像同步操作一樣遵循順序,進而避免嵌套回調。也就是說,隻要在每次的成功實作,也就是then()方法中,再次傳回新的promise對象,就可以再次調用該promise對象的then()方法,這樣異步行為也就可以像同步操作那樣,按順序組合起來了。并且這個組合是鍊式的,從前到後的,進而避免了多層嵌套:

????參考

javascript promises: an introduction

繼續閱讀