发布于:2021-02-18 00:00:34
0
128
0
Promise已经成为JavaScript的不可思议的补充。它们为我们节省了回调的麻烦,使异步编码更易于维护,并允许我们一次跟踪多个异步进程。 Promise.all 浮现在脑海中,让我们在多个诺言得到解决时做出反应。不幸的是,Promise.all 只有在所有的Promise都得到解决时才解决,因此,如果任何一个Promise都失败了,catch则调用而不是then:
Promise.all([
Promise.resolve(1),
Promise.reject(0)
])
.then(() => { console.log('resolved!'); })
.catch(() => { console.log('failed!') });
// >> failed!
如果您希望执行相同的功能而不管阵列中的任何Promise是否被拒绝,这都是一个问题。您可以提供与相同的功能then ,catch 但是这可能导致维护问题,并偶尔出现“ WTF就是这个!”。其他工程师的评论。
那么,Promise.all 无论有何拒绝,我们都想触发功能时该怎么办? 杰克·阿奇博尔德有答案:
Promise.all(promises.map(p => p.catch(() => undefined)));
每个promise的catch 回调都会返回undefined ,从而使promise的失败被视为成功。为了证明它可行,请考虑以下代码段:
Promise.all([
// Resolves
Promise.resolve(1),
// Rejects after 2 seconds
new Promise((resolve, reject) => setTimeout(() => reject(1), 2000))
].map(p => p.catch(() => undefined))).then(() => console.log('done!'));
// >> done!
尽管第二个Promise被拒绝,但Promise.all then 仍被称为!将来,我们将能够Promise.prototype.finally用来更轻松地处理成功和失败。
作者介绍