解決回調(diào)地獄(一): Promise

前言: Promise是異步編程的一種解決方案, 比傳統(tǒng)的解決方案--回調(diào)函數(shù)和事件更加強大.由社區(qū)最早提出和實現(xiàn),ES6將其寫進了語言標準,統(tǒng)一了用法,原生提供了Promise對象.
沒有Promise之前,解決異步都是依賴回調(diào),但執(zhí)行多個具備前后順序的異步操作時代碼就會非常亂并且出現(xiàn)問題難調(diào)試.

image.png

這只是簡單的數(shù)據(jù)庫查詢操作,當操作多時就會回調(diào)中嵌著回調(diào),所謂的回調(diào)地獄.
使用Promise呢?

image.png

橫向?qū)懘a變成了縱向,更加的直觀,使用then進行下一步,代碼清晰.

說一下Promise的基本用法, Promise有三種狀態(tài). 可以看下面的圖片

image.png

Promise一旦新建就立刻執(zhí)行, 此時的狀態(tài)是Pending(進行中),它接受兩個參數(shù)分別是resolve和reject.它們是兩個函數(shù).
resolve函數(shù)的作用是將Promise對象的狀態(tài)從'未完成'變?yōu)?成功'(由Pending變?yōu)镽esolved), 在異步操作成功時,將操作結(jié)果作為參數(shù)傳遞出去;
reject函數(shù)的作用是將Promise對象的狀態(tài)從'未完成'變?yōu)槭?由Pending變?yōu)镽ejected),在異步操作失敗時調(diào)用,并將異步操作的錯誤作為參數(shù)傳遞出去.

Promise的用法
1.生成Promise實例

  1. 執(zhí)行一系列同步操作
    3.使用resolve函數(shù)將異步操作的結(jié)果傳遞出去, reject函數(shù)傳遞異步操作的錯誤
    4.用then方法分別指定Resolve狀態(tài)和Reject狀態(tài)的函數(shù),then方法返回一個新的Promise實例,因此可以采用鏈式寫法
image.png

catch函數(shù): 用于指定發(fā)生錯誤時的回調(diào)函數(shù), 可以看成是 .then( null, reject() );當執(zhí)行多個then操作時,建議用catch進行錯誤處理, 不用每個then函數(shù)都寫一個reject的回調(diào)函數(shù)

image.png

catch回捕捉到前面執(zhí)行時發(fā)生的錯誤.

Promise.all( 傳入一個數(shù)組,每一項分別是一個Promise實例 ), 當數(shù)據(jù)里的Promise狀態(tài)都變?yōu)閞esolve時, Promise.all狀態(tài)才變?yōu)閞esolve
只要有一個Promise的狀態(tài)變?yōu)閞eject, Promise.all就變?yōu)閞eject; 可以將數(shù)組里的Promise看成是 "與" 關(guān)系

Promise.race( 傳入一個數(shù)組,每一項分別是Promise實例 ), 與Promise.all相反, race可以看到 是 "或" 關(guān)系, 只要有一個Promise狀態(tài)變?yōu)閞esolve, Promise.all 就變?yōu)閞esolve

Promise.resolve(): 將現(xiàn)有對象轉(zhuǎn)為Promise對象
(1) 參數(shù)是一個Promise實例的話,不做任何變動,返回原對象

(2) 參數(shù)是一個具有then方法的對象

image.png

Promise.resolve方法會將這個對象轉(zhuǎn)為Promise對象, 然后立即執(zhí)行該對象的then方法

(3) 參數(shù)不具有then方法, 或者根本不是對象. Promise.resolve方法返回一個新的Promise對象, 狀態(tài)為Resolve

image.png

(4) 不帶任何任何參數(shù)
Promise.resolve方法直接返回一個Resolve狀態(tài)的Promise對象

Promise.reject(): 返回一個新的Promise實例,該實例狀態(tài)為reject; 參數(shù)用法與Promise.resolve()方法完全一致

注意
Promise.resolve(返回的數(shù)據(jù)將成為下一個then函數(shù)中的參數(shù))


Promise.resolve()
.then(function(){
//異步函數(shù)
}).then(function(){
//異步函數(shù)
})


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,834評論 1 56
  • 目錄:Promise 的含義基本用法Promise.prototype.then()Promise.prototy...
    BluesCurry閱讀 1,563評論 0 8
  • 00、前言Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強大。它由社區(qū)...
    夜幕小草閱讀 2,226評論 0 12
  • Promiese 簡單說就是一個容器,里面保存著某個未來才會結(jié)束的事件(通常是一個異步操作)的結(jié)果,語法上說,Pr...
    雨飛飛雨閱讀 3,487評論 0 19
  • 所以今天比較順利,從陽光明媚平靜的海面遠離海岸線,游艇開始各種顛,雖然這是有生以來第三次進入大海的懷抱,可是遠離海...
    致良知的雪閱讀 634評論 0 4

友情鏈接更多精彩內(nèi)容