Promise.all用于拒绝和解决

发布于:2021-02-18 00:00:34

0

125

0

Promise JavaScript catch

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用来更轻松地处理成功和失败。