promise的其他api
实例成员
- then:注册一个后续处理函数,当promise为resolved状态时运行该函数
- catch:注册一个后续处理函数,当promise为rejected状态时运行该函数
- finally:【es2018】注册一个后续处理函数(无参),当promise为已决时运行该函数
静态成员
- resolved(数据):该方法返回一个resolved状态的promise,传递的数据作为状态数据。特殊情况:如果传递的数据是promise,则直接返回传递的promise对象。
- reject(数据):该方法返回一个rejected状态的Promise,传递的数据作为状态数据
- all(可迭代的数据):这个方法返回一个新的promise对象,该对象在可迭代的参数对象里所有的promise都成功后,才会触发执行then,如果有一个失败,就立即触发失败的promise处理。这个新的promise对象在触发成功状态后,会把所有的promise成功的返回值的数组作为成功回调的返回值,如果失败,会把第一个失败的promise对象的错误信息作为它的错误信息。
- race(可迭代的数据):当可迭代的参数里的任何一个子promise成功或者失败后,父promise也会马上用子promise的处理结果作为参数调用本身的函数,并返回自己的promise对象。
例子
- 1.finally
const pro = new Promise((resolve, reject)=>{
resolve(1);
})
pro.finally(()=>console.log('finally1'));
pro.finally(()=>console.log('finally2'));
pro.then(resp=>console.log('then1', resp*1));
pro.then(resp=>console.log('then2', resp*2));
const pro = new Promise((resolve, reject)=>{
reject(1);
})
pro.finally(()=>console.log('finally1'));
pro.finally(()=>console.log('finally2'));
pro.catch(resp=>console.log('catch1',resp*1));
pro.catch(resp=>console.log('catch2',resp*2));
- 2静态成员
const pro = new Promise((resolve, reject)=>{
resolve(1);
})
// 等效于
const pro = Promise.resolve(1);
console.log(pro.then(resp=>console.log(resp*100)));
const pro = new Promise((resolve, reject)=>{
reject(1);
})
// 等效于
const pro = Promise.reject(1);
console.log(pro.catch(err=>console.log(err*100)));
const p = new Promise((resolve, reject)=>{
resolve(3);
})
const pro = Promise.resolve(p);
// 等效于
const pro = p;
console.log(pro === p);
- 3.all
const proms = [];
for(let i = 0; i < 10; i++){
proms.push(new Promise((resolve, reject)=>{
setTimeout(()=>{
if(Math.random() < 0.5){
console.log(i, '完成');
resolve(i);
}else{
console.log(i, '失败');
reject(i);
}
}, 1000);
}))
}
// 等所有的promise变成resolved状态后输出:全部完成
const pro = Promise.all(proms);
pro.then(datas=>{
console.log('全部完成', datas);
})
pro.catch(err =>{
console.log('有失败的', err);
})
console.log(proms);
const proms = [];
for (let i = 0; i < 10; i++) {
proms.push(new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() < 0.5) {
console.log(i, "完成");
resolve(i);
} else {
console.log(i, "失败")
reject(i);
}
}, 1000);
}))
}
// 只要有一个完成,就立马输出 有一个失败也立马输出
const pro = Promise.race(proms)
pro.then(data => {
console.log("有promise成功了", data);
},err => {
console.log("有promise失败了", err);
})
console.log(proms);