Promise已婚,Promise.all该怎么办?手动撮合!
JS手动实现Promise.all
JavaScript中的Promise.all方法可以接收一个promise数组作为参数,返回一个新的promise对象,该对象在数组中所有promise都成功时才会被resolve。如果其中有一个promise失败,则Promise.all会立即将其reject,并且不再等待其他promise的执行结果。本文将介绍如何手动实现这个方法。
实现步骤
我们来看一下实现Promise.all的思路。首先,我们需要创建一个新的Promise对象,然后遍历传入的promise数组,当所有promise都成功时,我们将返回一个包含所有promise结果的数组,否则我们将直接reject这个新的Promise对象。
下面是具体的实现步骤:
- 创建一个新的Promise对象。
javascriptCopy Code
function myPromiseAll(promises) {
return new Promise((resolve, reject) => {
// ...
});
}
- 创建一个空数组来存储每个promise的结果。
javascriptCopy Code
function myPromiseAll(promises) {
let results = [];
return new Promise((resolve, reject) => {
// ...
});
}
- 遍历传入的promise数组,对每个promise调用then方法,将结果存入results数组。
javascriptCopy Code
function myPromiseAll(promises) {
let results = [];
return new Promise((resolve, reject) => {
promises.forEach((promise) => {
promise.then((result) => {
results.push(result);
if (results.length === promises.length) {
resolve(results);
}
}).catch((error) => {
reject(error);
});
});
});
}
- 当所有promise都成功时,resolve新的Promise对象并返回包含所有promise结果的数组;否则直接reject新的Promise对象。
javascriptCopy Code
function myPromiseAll(promises) {
let results = [];
return new Promise((resolve, reject) => {
promises.forEach((promise) => {
promise.then((result) => {
results.push(result);
if (results.length === promises.length) {
resolve(results);
}
}).catch((error) => {
reject(error);
});
});
}).catch((error) => {
reject(error);
});
}
示例代码
下面是一个使用myPromiseAll方法的示例代码:
javascriptCopy Code
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);
const promises = [promise1, promise2, promise3];
myPromiseAll(promises).then((results) => {
console.log(results); // [1, 2, 3]
}).catch((error) => {
console.error(error);
});
结语
本文介绍了如何手动实现Promise.all方法。希望读者可以通过本文对JavaScript中的Promise有更加深入的理解。
转载自:https://juejin.cn/post/7225425984312901692