promise是什么意思 promise的用法( 四 )


const p = Promise.all([p1, p2, p3]);

相较于then方法的链式操作,Promise.all()更注重并发,即依次按顺序发送多个请求,等待所有的请求均有结果之后,对应请求顺序将数据依次存放到数组中返回 。
模拟封装(简易版)
Promise.myAll = function (list) {
return new Promise(function (resolve, reject) { // 返回一个新的Promise实例
var arr = [];
for (let i = 0; i < list.length; i++) {
let p = list[i];// 每一个Promise实例(如果传入的数据非Promise实例 会通过Promise.resolve转化)
// 提前规定好每一个实例 成功和失败时执行的内容 => 请求有结果之后会执行
p.then(res => { //等待异步操作有结果之后 对应下标放到数组中
arr[i] = res;
if (arr.length === list.length) { // 所有的请求全都成功 => (也是一个异步操作)
resolve(arr);
}
}).catch(err => { //只要有一个失败 就走catch
console.log(err);
reject(err);
})
}
})
}
const p = Promise.myAll([p1, p2, p3]);

通过以上代码可以发现: (摘自ECMAScript 6 入门)
Promise.all()方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理 。另外,Promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例 。
p的状态由p1、p2、p3决定,分成两种情况 。
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数 。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数 。
Promise.race
Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例 。
const p = Promise.race([p1, p2, p3]);

相较于Promise.all方法,Promise.race方法更侧重状态改变的速度 。
模拟封装(简易版)
Promise.myRace = function (list) {
return new Promise(function (resolve, reject) { // 返回一个新的Promise实例
for (let i = 0; i < list.length; i++) {
let p = list[i];// 每一个Promise实例 (如果传入的数据非Promise实例 会通过Promise.resolve转化)
// 提前规定好每一个实例 成功和失败时执行的内容 => 请求有结果之后会执行
p.then(res => { //等待异步操作有结果之后 对应下标放到数组中
resolve(res);
}).catch(err => {
reject(err);
})
}
})
}
const p = Promise.myRace([p1, p2, p3]);

通过以上代码可以发现: (摘自ECMAScript 6 入门)
只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变 。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数 。
Promise.allSettled
Promise.allSettled()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例 。
const p = Promise.allSettled([p1, p2, p3]);

相较于Promise.all方法,Promise.allSettled跟注重于不管每一个Promise实例是成功还是失败,都会将结果依次按请求顺序放到数组中 。
模拟封装(简易版)
Promise.myAllSettled = function (list) {
return new Promise(function (resolve, reject) { // 返回一个新的Promise实例
var arr = [];
for (let i = 0; i < list.length; i++) {
let p = list[i];// 每一个Promise实例 (如果传入的数据非Promise实例 会通过Promise.resolve转化)
// 提前规定好每一个实例 成功和失败时执行的内容 => 请求有结果之后会执行
p.then(res => { //等待异步操作有结果之后 对应下标放到数组中
var obj = { status: \\\"fulfilled\\\", value: txt };
arr[i] = obj;
if (arr.length === list.length) { // 请求全都成功 => arr(异步)
resolve(arr);
}
}).catch(err => {
var obj = { status: \\\"rejected\\\", reason: err };
arr[i] = obj;
if (arr.length === list.length) { // 请求全都成功 => arr(异步)
resolve(arr);
}
})
}
})
}
const p = Promise.myAllSettled([p1, p2, p3])

值得注意的地方时,在将数据放到数组的过程中,传入的Promise实例的状态不同,放置的结果稍有不同(数组中的每个成员是一个对象,对象的格式是固定的) 。