理解承诺链

时间:2016-08-10 12:20:40

标签: javascript node.js promise es6-promise

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

我有一个暴露的功能:

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

.then方法接受两个参数:onFulfilledonRejected。如果您不提供onRejected回调,则不会调用此特定.then,并且该链将落入实现onRejected {的下一个处理程序{1}}。

.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,以便捕获任何和所有错误。