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

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

橫向?qū)懘a變成了縱向,更加的直觀,使用then進行下一步,代碼清晰.
說一下Promise的基本用法, Promise有三種狀態(tài). 可以看下面的圖片

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

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

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方法的對象

Promise.resolve方法會將這個對象轉(zhuǎn)為Promise對象, 然后立即執(zhí)行該對象的then方法
(3) 參數(shù)不具有then方法, 或者根本不是對象. Promise.resolve方法返回一個新的Promise對象, 狀態(tài)為Resolve

(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ù)
})