1. promise.all
- 返回一个promise方法
- 可以将多个
Promise实例包装成一个新的Promise实例。 - 成功的时候返回一个数组,把所有成功值都传回来。
Promise.all获得的成功结果数组顺序和执行传入的顺序一致。- 失败了,返回第一个失败状态的值。
使用场景:
Promise.all( ).then( )适用于处理多个异步任务且所有的异步任务都得到结果时的情况。
例如:页面中有两部分数据呈现,分别是两个后端接口,初始时loading为true,只有等这两部分数据都从接口中获取后,loading才会false。
function promiseAll(promise){
return new Promise((resolve,reject)=>{
let result = [];
let count = 0;
for(let i = 0;i<promise.length;i++){
promise[i].then(res=>{
result[i] = res;
count++;
if(count === promise.length){
resolve(result);
}
},err=>{
reject(err);
})
}
})
}
2. promise.race
- 返回一个promise方法
- 若迭代器中的某个promise解决或拒绝,返回的promise就会解决或拒绝。
使用场景:
点一个按钮,发送多个请求,当接收到其中一个请求后,就响应相关的数据。
function promiseRace(promise) {
return new Promise((resolve, reject) => {
for (let i = 0; i < promise.length; i++) {
promise[i].then(
(res) => {
resolve(res);
},
(err) => {
reject(err);
}
);
}
});
}
3. promise.allSettled
- 返回一个数组值,将每一个
Promise值的状态返回。 - 永远不会被rejected.
使用场景: 一个页面上有多个独立的表单,表单分别对应不同的接口,接口独立,没有顺序依赖,需要等到请求全部结束后给与用户提示表单提交的情况。
function promiseAllSettled(promise) {
return new Promise((resolve, reject) => {
let result = [];
let count = 0;
for (let i = 0; i < promise.length; i++) {
const obj = {};
promise[i].then(
(res) => {
count++;
obj.value = res;
obj.status = "fulfilled";
result[i] = obj;
if (count === promise.length) {
resolve(result);
}
},
(err) => {
count++;
obj.value = err;
obj.status = "rejected";
result[i] = obj;
if (count === promise.length) {
resolve(result);
}
}
);
}
});
}
- promise.any
- promise.any和promise.all是相反的一个方法
- promise.any需要判断是否全部reject
使用场景: 从最快的服务器检索资源,如果存在多台服务器,从最快的一台服务器获取资源。
function promiseAny(promise) {
return new Promise((resolve, reject) => {
let result = [];
let count = 0;
for (let i = 0; i < promise.length; i++) {
promise[i].then(
(res) => {
resolve(res);
},
(err) => {
result[i] = err;
count++;
if (count === promise.length) {
reject(err);
}
}
);
}
});
}