javascript
语言解决猜神童年龄的问题_JavaScript语言基础:Promise是如何解决回调地狱问题的?...
鏈接:https://juejin.im/post/5aa1fce051882555677e21aa
眾所周知的,Javascript是一種單線程的語言,所有的代碼必須按照所謂的“自上而下”的順序來執行。本特性帶來的問題就是,一些將來的、未知的操作,必須異步實現。本文將討論一個比較常見的異步解決方案——Promise。
Promise解決的問題
相信每個前端都遇到過這樣一個問題,當一個異步任務的執行需要依賴另一個異步任務的結果時,一般會將兩個異步任務嵌套起來,這種情況發生一兩次還可以,但是發生很多次之后,代碼就會變成這個熊樣:
async1(function(){async2(function(){async3(function(async4(funciton(){async5(function(){ // 直到地老天荒});});));});});這就是所謂的回調地獄,代碼層層嵌套,環環相扣,很明顯,邏輯稍微復雜一些,這樣的程序就會變得難以維護。
Promise的基本用法
時至今日,很多現代瀏覽器都已經實現,但是為了兼容,建議自行對Promise進行封裝或者使用第三方的解決方案(如webpack對es6語法進行編譯)。得到一個Promise構造函數,新建一個Promise的實例:
var _promise = new Promise(function(resolve, reject){setTimeout(function(){var rand = Math.random();if(rand<0.5){resolve("resolve" + rand);}else{reject("reject" + rand);}},1000);});由上所示,Promise的構造函數接收一個函數作為參數,該函數接受兩個額外的函數,resolve和reject,這兩個函數分別代表將當前Promise置為fulfilled(解決)和rejected(拒絕)兩個狀態。Promise正是通過這兩個狀態來控制異步操作的結果。接下來我們將討論Promise的用法,實際上Promise上的實例 _promise是一個對象,不是一個函數。在聲明的時候,Promise傳遞的參數函數會立即執行,因此Promise使用的正確姿勢是在其外層再包裹一層函數。
var run = function(){var _promise = new Promise(function(resolve, reject){setTimeout(function(){var rand = Math.random();if(rand<0.5){resolve("resolve" + rand);}else{reject("reject" + rand);}},1000);});return _promise;}run();這是Promise的正常用法,接下來,就是對異步操作結果的處理,接著上面創建的函數run()
run().then(function(data){console.log(data);});每個Promise的實例對象,都有一個then的方法,這個方法就是用來處理之前各種異步邏輯的結果。
那么, 這么做有什么用?
當然有用,到目前為止,我們學會了Promise的基本流程,但是這種用法和嵌套回調函數似乎沒什么區別,而且增加了復雜度。但是我們說了,Promise的用處,實際上是在于多重異步操作相互依賴的情況下,對于邏輯流程的控制。Promise正是通過對兩種狀態的控制,以此來解決流程的控制。請看如下代碼:
run().then(function(data){//處理resolve的代碼cosnole.log("Promise被置為resolve總結
以上是生活随笔為你收集整理的语言解决猜神童年龄的问题_JavaScript语言基础:Promise是如何解决回调地狱问题的?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中加减乘除_【泓泰花园】精雕细琢的好房子
- 下一篇: 农业银行信用币怎么使用