Promise.allSettled 的替代方案
Alternative for Promise.allSettled
我目前正在使用 Promise.allSettled
等待我所有的承诺完成(无论它们是解决还是被拒绝)。
由于我的项目符合 Node v12.3.1
我无法使用它?
我还可以使用哪些其他简单的替代方法。
示例代码:
async function runner() {
let promises = [];
for(let i=0; i<10; i++) {
promises.push(fetcher())
}
await Promise.allSettled(promises).then(([results]) => console.log(results.length));
console.log('continue work...');
}
注意:
Promise.allSettled 可从 Node version >12.9
获得。
添加垫片也不是一种选择。
您可以手动执行一个 polyfill 小技巧来模拟 Promise.allSettled
的效果。
这是片段。
if (!Promise.allSettled) {
Promise.allSettled = promises =>
Promise.all(
promises.map((promise, i) =>
promise
.then(value => ({
status: "fulfilled",
value,
}))
.catch(reason => ({
status: "rejected",
reason,
}))
)
);
}
Promise.allSettled(promises).then(console.log);
这意味着映射所有承诺,然后 return 结果,成功或被拒绝。
另一种选择,如果您不想要 Promise.all
的类对象性质,以下代码段可能会有所帮助。这很简单,你只需要在这里添加.catch
方法。
const promises = [
fetch('/something'),
fetch('/something'),
fetch('/something'),
].map(p => p.catch(e => e)); // this will prevent the promise from breaking out, but there will be no 'result-object', unlike the first solution.
await Promise.all(promises);
Returns 在所有给定的承诺都已实现或拒绝后解决的承诺,以及描述每个承诺结果的一系列对象。
图书馆:
https://www.npmjs.com/package/promise-ax
示例:
const { createPromise } = require('promise-ax');
const promiseAx = createPromise();
const promise1 = Promise.resolve(4);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, new Error("error")));
const promise3 = Promise.reject("error");
const promise4 = promiseAx.resolve(8);
const promise5 = promiseAx.reject("errorAx");
const asyncOperation = (time) => {
return new Promise((resolve, reject) => {
if (time < 0) {
reject("reject");
}
setTimeout(() => {
resolve(time);
}, time);
});
};
const promisesToMake = [promise1, promise2, promise3, promise4, promise5, asyncOperation(100)];
promiseAx.allSettled(promisesToMake).then((results) => results.forEach((result) => console.log(result)));
// Salida esperada:
// 4
// Error: error
// error
// 8
// errorAx
// 100
您可以尝试这样的操作:
await (Promise as any).allSettled(promises).then(console.log);
这适用于打字稿。
我目前正在使用 Promise.allSettled
等待我所有的承诺完成(无论它们是解决还是被拒绝)。
由于我的项目符合 Node v12.3.1
我无法使用它?
我还可以使用哪些其他简单的替代方法。
示例代码:
async function runner() {
let promises = [];
for(let i=0; i<10; i++) {
promises.push(fetcher())
}
await Promise.allSettled(promises).then(([results]) => console.log(results.length));
console.log('continue work...');
}
注意:
Promise.allSettled 可从 Node version >12.9
获得。
添加垫片也不是一种选择。
您可以手动执行一个 polyfill 小技巧来模拟 Promise.allSettled
的效果。
这是片段。
if (!Promise.allSettled) {
Promise.allSettled = promises =>
Promise.all(
promises.map((promise, i) =>
promise
.then(value => ({
status: "fulfilled",
value,
}))
.catch(reason => ({
status: "rejected",
reason,
}))
)
);
}
Promise.allSettled(promises).then(console.log);
这意味着映射所有承诺,然后 return 结果,成功或被拒绝。
另一种选择,如果您不想要 Promise.all
的类对象性质,以下代码段可能会有所帮助。这很简单,你只需要在这里添加.catch
方法。
const promises = [
fetch('/something'),
fetch('/something'),
fetch('/something'),
].map(p => p.catch(e => e)); // this will prevent the promise from breaking out, but there will be no 'result-object', unlike the first solution.
await Promise.all(promises);
Returns 在所有给定的承诺都已实现或拒绝后解决的承诺,以及描述每个承诺结果的一系列对象。
图书馆: https://www.npmjs.com/package/promise-ax
示例:
const { createPromise } = require('promise-ax');
const promiseAx = createPromise();
const promise1 = Promise.resolve(4);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, new Error("error")));
const promise3 = Promise.reject("error");
const promise4 = promiseAx.resolve(8);
const promise5 = promiseAx.reject("errorAx");
const asyncOperation = (time) => {
return new Promise((resolve, reject) => {
if (time < 0) {
reject("reject");
}
setTimeout(() => {
resolve(time);
}, time);
});
};
const promisesToMake = [promise1, promise2, promise3, promise4, promise5, asyncOperation(100)];
promiseAx.allSettled(promisesToMake).then((results) => results.forEach((result) => console.log(result)));
// Salida esperada:
// 4
// Error: error
// error
// 8
// errorAx
// 100
您可以尝试这样的操作:
await (Promise as any).allSettled(promises).then(console.log);
这适用于打字稿。