了解承诺链

Understanding promise chains

我在 NodeJS 项目中使用 Promises,想更好地理解 Promise.chains。

我有一个公开的功能:

我希望我的用户调用的主要库函数。它将 return 一个承诺,然后用户需要处理解决和拒绝。

Main 库函数将调用许多我想链接的其他库函数。所以这些函数中的每一个都会 return 像这样的承诺:

mainLibraryFunction = function (arguments...) {
  return this.firstLibraryFn().then(secondLibraryFn).then(thirdLibraryFn)...
}

其中每一个都会 return 一个承诺,可以是拒绝或解决。我想要的是,如果任何库函数拒绝,然后将拒绝传递给下一个函数,我想 return 从 MainLibraryFunction 中拒绝。因为否则我需要为每个库函数实现错误情况的处理。因为他们每个人都会得到承诺作为参数,所以我需要检查每个函数,我是否得到解决或拒绝承诺作为参数。然后我需要将被拒绝的参数传递给所有函数,直到最后一个函数可以 return 将其从 MainLibraryFunction 中移出。这可不明智。

那么处理这个问题的最佳做法是什么?我应该在链的末尾添加 catch 吗?我听说如果我在最后添加一个 catch,即使他们中的任何一个拒绝,它也应该打破链条。然后从捕获中,我可以 return Promise.reject() 从 MainLibraryFunction.

.then 方法接受两个参数:onFulfilledonRejected。如果你不提供 onRejected 回调,这个特定的 .then 将不会被调用,链将下降到下一个实现 onRejected or[=32 的处理程序=] .catch.

Promise.reject()
    .then(() => console.log('onFulfilled 1'))
    .catch(() => console.log('catch 1'));  // will get called

Promise.reject()
    .then(
        () => console.log('onFulfilled 2'),
        () => console.log('onRejected 2')  // will get called
    )
    .catch(() => console.log('catch 2'));  // will not get called

因此,不,您不必让每个函数都解析它们的参数。如果 promise 被拒绝,secondLibraryFn 等将不会被调用,因为它们仅被定义为 onFulfilled 处理程序。您可以安全地假设它们将被跳过,只需在链的末尾添加一个 .catch 即可捕获任何和所有错误。