Promise 方法实现
function promiseAll(promises) {
return new Promise((resolve, reject) => {
if (!Array.isArray(promises)) {
return reject(new TypeError("Argument must be an array"));
}
let resolvedValues = [];
let resolvedCount = 0;
promises.forEach((promise, index) => {
Promise.resolve(promise).then(
value => {
resolvedValues[index] = value;
resolvedCount++;
if (resolvedCount === promises.length) {
resolve(resolvedValues);
}
},
reason => {
reject(reason);
}
);
});
});
}
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
promiseAll([promise1, promise2, promise3]).then(values => {
console.log(values);
}).catch(error => {
console.error(error);
});
function promiseAllSettled(promises) {
return new Promise((resolve) => {
if (!Array.isArray(promises)) {
return reject(new TypeError("Argument must be an array"));
}
let settledValues = [];
let settledCount = 0;
promises.forEach((promise, index) => {
Promise.resolve(promise).then(
value => {
settledValues[index] = { status: "fulfilled", value: value };
},
reason => {
settledValues[index] = { status: "rejected", reason: reason };
}
).finally(() => {
settledCount++;
if (settledCount === promises.length) {
resolve(settledValues);
}
});
});
});
}
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(reject, 100, 'foo');
});
promiseAllSettled([promise1, promise2, promise3]).then(results => {
console.log(results);
});