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