所謂promise碌秸,其實就是異步編程的一種解決方案。
特點:
promise對象狀態(tài)不受外界影響(由異步操作的結(jié)果決定)崭参。
- pending:進行中
- resolved(fulfilled):已完成
- rejected:已失敗
一旦狀態(tài)改變请琳,將不會再變(狀態(tài)凝固,保持不變)
- pending → resolved
- pending → rejected
缺點:
- 無法中途取消promise
- 如果不設置回調(diào)函數(shù)层坠,promise內(nèi)部拋出的錯誤無法反應到外部
- pending狀態(tài)下,無法得知進展階段
==============================================
var promise = new Promise( (resolve,reject) => {
if (/*異步操作成功*/) {
resolve(value);
} else {
reject(error);
}
} )
==============================================
注:Promise是一個構(gòu)造函數(shù)刁笙,用來創(chuàng)建promise實例破花。參數(shù)為一個函數(shù)谦趣,該函數(shù)有兩個參數(shù):
- resolve:當異步操作返回成功時調(diào)用,并將結(jié)果傳遞給回調(diào)函數(shù)
- reject:當異步操作返回失敗時調(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實例,當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)為準挫以,觸發(fā)p2回調(diào)函數(shù)中的catch方法
Promise.prototype.then()
then方法返回的是一個新的promise實例者蠕,因此可以采用鏈式寫法(前一個回調(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方法抡句,當then方法內(nèi)拋出異常時,也會被catch方法捕獲
Promise.all()
用于將多個promise實例包裝成一個promise實例杠愧,參數(shù)為一個包含多個promise實例的數(shù)組待榔,如果數(shù)組元素不是promise實例,會先調(diào)用Promise.resolve方法轉(zhuǎn)換為promise實例
- p1, p2, p3均為resolve時流济,返回的p也為resolve
- p1, p2, p3有一個為reject時锐锣,p為reject,此時第一個被reject的返回值會傳遞給p的回調(diào)函數(shù)
Promise.race()
參數(shù)同all方法绳瘟,不同的是雕憔,當參數(shù)中的實例有一個返回率先改變狀態(tài),p的狀態(tài)便隨之改變糖声。
Promise.resolve()
將現(xiàn)有對象轉(zhuǎn)換為promise對象橘茉。
- 參數(shù)是一個promise實例時,不做修改返回姨丈。
- 參數(shù)是一個thenable(含有then方法的對象)時,會先轉(zhuǎn)換為promise對象擅腰,并立即執(zhí)行thenable對象內(nèi)的then方法蟋恬。
- 參數(shù)不是一個對象時,返回一個新的promise對象趁冈,狀態(tài)為resolve歼争。
- 當沒有參數(shù)時拜马,直接返回一個狀態(tài)為resolve的promise對象。
Promise.reject()
返回一個狀態(tài)為reject的promise對象沐绒。
done()
處于回調(diào)鏈的尾端俩莽,保證最后一個then或者catch方法拋出的錯誤可以接收到。
finally()
無論最后的狀態(tài)是哪一個乔遮,都會執(zhí)行的代碼塊扮超。