我在NodeJS项目中使用Promise,并希望更好地理解Promise.chains。
我有一个暴露的功能:
主库函数,我希望我的用户可以调用。它将返回一个承诺,然后用户需要处理解决方案并拒绝承诺。
主库函数将调用许多其他库函数,我想链接。所以这些函数中的每一个都会返回一个这样的承诺:
mainLibraryFunction = function (arguments...) {
return this.firstLibraryFn().then(secondLibraryFn).then(thirdLibraryFn)...
}
每个都会返回一个承诺,可以是拒绝或解决。我想要的是,如果任何库函数拒绝,然后将拒绝传递给下一个函数,我想将拒绝退出MainLibraryFunction。因为否则我需要为每个库函数实现错误情况的处理。因为他们每个人都会得到承诺作为参数,我需要检查每个函数,我得到解决或拒绝作为参数的承诺。然后我需要通过所有函数传递被拒绝的参数,直到最后一个函数可以将它从MainLibraryFunction返回。这不是明智之举。
那么处理这个问题的最佳做法是什么?我应该在链的末尾添加捕获量吗?我听说如果我在最后添加一个捕获,它应该打破链,即使它们中的任何一个会拒绝。然后从catch中,我可以从MainLibraryFunction返回Promise.reject()。
答案 0 :(得分:2)
.then
方法接受两个参数:onFulfilled
和onRejected
。如果您不提供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
,以便捕获任何和所有错误。