我在一个异步运行的循环中处理一个列表,返回一个 promise ,我不想在异常时退出处理,所以我聚合它们并将它们传递给外部 finally block 中的解析回调。 我想知道这是否是反模式,如果是,请提供有关如何正确执行的指示。 谢谢。
例子
async doSomething(list) {
let errorCount = 0
let errors = []
return new Promise(async (resolve, reject) => {
try {
list.forEach(async (item) => {
try {
actionThatThrows(item)
} catch (e) {
errorCount++
errors[errorCount] = e
}
})
} catch (e) {
errorCount++
errors[errorCount] = e
} finally {
if (errorCount > 0) {
resolve(errors)
} else {
resolve()
}
}
})
最佳答案
是的,这段代码使用了几个反模式:
- Never pass an
async function
to aPromise
constructor - Never use the
Promise
constructor when you already have promises around -
forEach
does not work withasync function
s
I do not want to exit processing on exception but aggregate them
为此你可能想看看 Wait until all ES6 promises complete, even rejected promises。
但是你也可以在没有这些的情况下做到这一点,假设你想要顺序迭代:
async function doSomething(list) {
const errors = [];
for (let item of list) {
try {
await actionThatThrows(item);
} catch (e) {
errors.push(e);
}
}
if (errors.length)
return errors;
else
return …;
}
关于javascript - 反模式聚合错误并传递给 promise 解析 js?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41257319/