1 promise含義
簡單說就是一個容器,里面保存著某個
未來才會結(jié)束
的事件(通常是一個異步操作的結(jié)果)Promise對象代表一個異步操作弄兜;
1 特點(diǎn)一(對象狀態(tài)不受外界影響)
三種狀態(tài):pending(進(jìn)行中)、resolved(已完成)、rejected(已失敳履辍)=》只有異步操作結(jié)果可以決定是哪一種狀態(tài);
2 特點(diǎn)二(一旦轉(zhuǎn)態(tài)改變疾忍,就不會再改變)
狀態(tài)改變的兩種可能: pending=>resolved ;pending=>rejected
3 優(yōu)點(diǎn)
有了Promise對象乔外,就可以將異步操作以同步操作的流程表達(dá)出來,避免了層層嵌套的回調(diào)函數(shù)一罩;
4 缺點(diǎn)
無法取消Promise杨幼,一旦創(chuàng)建它就立即執(zhí)行無法中途取消;
如果不設(shè)置毀掉函數(shù),promise內(nèi)部拋出的錯誤,不會反映到外部差购;
當(dāng)處于pending狀態(tài)時四瘫,無法得知目前進(jìn)展到哪一個階段;
如果某些事件不斷地反復(fù)發(fā)生欲逃,一般來說找蜜,使用 stream 模式是比部署Promise更好的選擇。
2 基本用法
promise新建后會立即執(zhí)行暖夭;then方法指定的回調(diào)函數(shù)锹杈,將在當(dāng)前腳本所有同步任務(wù)執(zhí)行完才會執(zhí)行;
如果調(diào)用resolve函數(shù)和reject函數(shù)時帶有參數(shù)迈着,那么它們的參數(shù)會傳遞給回調(diào)函數(shù)
resolve參數(shù):可能是正常值竭望,也可能是另一個promise實(shí)例;reject參數(shù)通常是Error的實(shí)例裕菠;
var p1= new Promise(function(resolve,reject){
setTimeout(()=> reject(new Error('fail')),3000)
})
var p2= new Promise(function(resolve,reject){
setTimeout(()=> resolve(p1),3000)
})
p2.then(result=>console.log(result+'1')).catch(error=>console.log(error+'2'))
//Error: fail2 p2返回的是另一個promise咬清,導(dǎo)致p2自己的狀態(tài)無效
3 Promise.all()
方法用于多個Promise實(shí)例,包裝成一個新的promise實(shí)例奴潘;
var p = Promise.all([p1,p2,p3]);(參數(shù)可以不是一個數(shù)組旧烧,但必須有Iterator接口,且返回的成員都是Promise實(shí)例画髓,如果參數(shù)不是promise實(shí)例掘剪,將會調(diào)用resolve方法轉(zhuǎn)換為promise實(shí)例)
p的狀態(tài)由p1,p2,p3三者全是resolve狀態(tài)才成功,否則失敗;等參數(shù)狀態(tài)都返回了才會觸發(fā)P的回調(diào)函數(shù)奈虾;
4 Promise.race()
var p = Promise.all([p1,p2,p3]);
方法用于多個Promise實(shí)例包裝成一個promise實(shí)例夺谁;參數(shù)中有一個狀態(tài)發(fā)生改變p的狀態(tài)就發(fā)生改變;
5 promise.resolve()與promise.reject()
將現(xiàn)有對象轉(zhuǎn)換為promise對象肉微;
Promise.resolve('foo')
// 等價于
new Promise(resolve => resolve('foo'))
參數(shù)是promise實(shí)例匾鸥,原封不動返回
參數(shù)時具有then方法的對象,轉(zhuǎn)換后立即執(zhí)行then方法碉纳;
參數(shù)不具有then方法或不是對象勿负,裝換后狀態(tài)為resolved;
不帶參數(shù)劳曹,直接調(diào)用回調(diào)函數(shù)奴愉,立即resolve的promise對象,是本輪時間結(jié)束時铁孵,而不是下一輪事件開始時
setTimeout(function () {
console.log('three');
}, 0);
Promise.resolve().then(function () {
console.log('two');
});
console.log('one');
// one
// two
// three