所謂promise,其實(shí)就是異步編程的一種解決方案。
特點(diǎn):
promise對象狀態(tài)不受外界影響(由異步操作的結(jié)果決定)。
- pending:進(jìn)行中
- resolved(fulfilled):已完成
- rejected:已失敗
一旦狀態(tài)改變,將不會再變(狀態(tài)凝固,保持不變)
- pending → resolved
- pending → rejected
缺點(diǎn):
- 無法中途取消promise
- 如果不設(shè)置回調(diào)函數(shù),promise內(nèi)部拋出的錯誤無法反應(yīng)到外部
- pending狀態(tài)下,無法得知進(jìn)展階段
==============================================
var promise = new Promise( (resolve,reject) => {
if (/*異步操作成功*/) {
resolve(value);
} else {
reject(error);
}
} )
==============================================
注:Promise是一個構(gòu)造函數(shù),用來創(chuàng)建promise實(shí)例。參數(shù)為一個函數(shù),該函數(shù)有兩個參數(shù):
- resolve:當(dāng)異步操作返回成功時調(diào)用,并將結(jié)果傳遞給回調(diào)函數(shù)
- reject:當(dāng)異步操作返回失敗時調(diào)用,并將錯誤信息傳遞給回調(diào)函數(shù)
==============================================
promise.then ( (value) => {
//success
}, (err) => {
//failure
} )
==============================================
注:then方法可以傳遞兩個回調(diào)函數(shù)作為參數(shù)(兩個函數(shù)均接受promise對象傳出的值作為參數(shù))
- 第一個回調(diào)函數(shù)為Promise狀態(tài)pending → resolve時調(diào)用
- 第二個回調(diào)函數(shù)為Promise狀態(tài)pending → reject時調(diào)用,可選
p1和p2是兩個promise實(shí)例,當(dāng)p2的resolve方法將p1作為參數(shù)時:
- p1為pending狀態(tài)時,p2的回調(diào)函數(shù)會等待p2狀態(tài)的改變;
- p2為resolve狀態(tài)時,p2的回調(diào)函數(shù)立即調(diào)用
- p2為reject狀態(tài)時,p2的回調(diào)函數(shù)立即調(diào)用,但是此時p2的狀態(tài)無效,以p1狀態(tài)為準(zhǔn),觸發(fā)p2回調(diào)函數(shù)中的catch方法
Promise.prototype.then()
then方法返回的是一個新的promise實(shí)例,因此可以采用鏈?zhǔn)綄懛ǎㄇ耙粋€回調(diào)函數(shù)執(zhí)行完畢,會把返回的結(jié)果作為參數(shù)傳遞給下一個回調(diào)函數(shù),以此類推)
Promise.prototype.catch()
和.then(null,reject)等價,用于指定發(fā)生錯誤時的回調(diào)。異步操作狀態(tài)變?yōu)閞eject時,調(diào)用catch方法,當(dāng)then方法內(nèi)拋出異常時,也會被catch方法捕獲
Promise.all()
用于將多個promise實(shí)例包裝成一個promise實(shí)例,參數(shù)為一個包含多個promise實(shí)例的數(shù)組,如果數(shù)組元素不是promise實(shí)例,會先調(diào)用Promise.resolve方法轉(zhuǎn)換為promise實(shí)例
- p1, p2, p3均為resolve時,返回的p也為resolve
- p1, p2, p3有一個為reject時,p為reject,此時第一個被reject的返回值會傳遞給p的回調(diào)函數(shù)
Promise.race()
參數(shù)同all方法,不同的是,當(dāng)參數(shù)中的實(shí)例有一個返回率先改變狀態(tài),p的狀態(tài)便隨之改變。
Promise.resolve()
將現(xiàn)有對象轉(zhuǎn)換為promise對象。
- 參數(shù)是一個promise實(shí)例時,不做修改返回。
- 參數(shù)是一個thenable(含有then方法的對象)時,會先轉(zhuǎn)換為promise對象,并立即執(zhí)行thenable對象內(nèi)的then方法。
- 參數(shù)不是一個對象時,返回一個新的promise對象,狀態(tài)為resolve。
- 當(dāng)沒有參數(shù)時,直接返回一個狀態(tài)為resolve的promise對象。
Promise.reject()
返回一個狀態(tài)為reject的promise對象。
done()
處于回調(diào)鏈的尾端,保證最后一個then或者catch方法拋出的錯誤可以接收到。
finally()
無論最后的狀態(tài)是哪一個,都會執(zhí)行的代碼塊。