promise其它api
- finally:[ES2018]注册一个后续处理函数(无参),当Promise为已决时运行该函数。为什么无参数,因为已决时,可能是resolve,也可能是rejected。传了参数不能确定是哪一个。
- 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));
pro.catch(resp => console.log("catch1", resp * 1));
pro.catch(resp => console.log("catch2", resp * 2));
const pro = new Promise((resolve, reject) => {
resolve(1);
})
pro.then(resp => console.log("then1", resp * 1));
pro.then(resp => console.log("then2", resp * 2));
pro.catch(resp => console.log("catch1", resp * 1));
pro.catch(resp => console.log("catch2", resp * 2));
pro.finally(() => console.log("finally1"))
pro.finally(() => console.log("finally2"))
静态方法 resolve
const pro = new Promise((resolve,reject)=>{
resolve(1;)
})
上面这段代码相当于:
const pro = Promise.resolve(1);
- 如果传递数据是promise,那么直接将promise返回
- Google是这样的,其它不一定。
const p = new Promise((resolve,reject)=>{
resolve(1;)
})
const pro = Promise.resolve(p);
//那么pro和p相等
console.log(p === pro); //true;
静态方法reject
const pro = new Promise((resolve,reject)=>{
reject(1;)
})
上面这段代码相当于:
const pro = Promise.reject(1);
all
Promise.all([pro1,pro2,pro3......])
- 返回一个新的promise,这个新的promise要等到,pro1,pro2…所以传递进来的promise变成resolved状态,才会触发新的promise的resolved。
比如:
const newPro = Promise.all([Promise,Promise,Promise,.....]);
newPro.then(data=>{
console.log(data);//这里输出要等到所有的Promise变成resolved状态。
})
- 例子
function getRandom(min,max){
return Math.floor(Math.random() * (max - min) + min);
}
const proms = [];
for(let i = 0 ; i < 10; i++){
proms.push(new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('resolve',i);
resolve(i);
},getRandom(2000,3000));
}))
}
const pro = Promise.all(proms);
pro.then(data=>{
console.log(data);
})
pro.then(data=>{
console.log(data);
})
输出data,必须要等到所以的promise变成resoled状态,一旦有reject那么就不会输出结果。
- 例如将上面的代码改写一下
function getRandom(min,max){
return Math.floor(Math.random() * (max - min) + min);
}
const proms = [];
for(let i = 0 ; i < 10; i++){
proms.push(new Promise((resolve,reject)=>{
setTimeout(()=>{
if(Math.random() > 0.5){
console.log('resolve',i);
resolve(i);
} else {
console.log('reject',i);
reject(i)
}
},getRandom(2000,3000));
}))
}
const pro = Promise.all(proms);
pro.then(data=>{
console.log(data);
},err=>{
console.log('err',err);
})
Promise.all()应用场景
基于等全部promise都变成resolved才会将结果输出,可以应用到页面中多个请求的合并,等到页面的所有请求完成后,处理什么事情。一旦有一个失败了就失败了。
Promise.race()
第一个完成,就是完成,第一个失败,就失败。只要有一个怎么样,整体就怎么样。看谁先完成,看谁先失败。
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
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)
}
}, getRandom(2000, 3000));
}))
}
const pro = Promise.race(proms);
pro.then(data => {
//有完成的立马运行到这里
console.log('有人完成了',data);
},err=>{
//有失败的立马运行到这里
console.log('有人失败了',err);
})
扫描二维码关注公众号,回复:
12830222 查看本文章