首页 文章

理解承诺链

提问于
浏览
1

我在NodeJS项目中使用Promises,并希望更好地理解Promise.chains .

我有一个暴露的功能:

主库函数,我希望我的用户调用 . 它将返回一个承诺,然后用户需要处理解决方案并拒绝承诺 .

主库函数将调用许多其他库函数,我想链接 . 所以这些函数中的每一个都会返回一个这样的承诺:

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

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

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

1 回答

  • 2

    .then 方法接受两个参数: onFulfilledonRejected . 如果您不提供 onRejected 回调,则不会调用此特定 .then ,并且链将转到实现 onRejected.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
    

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

相关问题