我看了一下bluebird承诺常见问题,其中提到。then(成功,失败)是一个反模式。我不太明白它对试捕的解释。
下面有什么问题吗?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
这个例子似乎在暗示下面的方法是正确的。
some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })
有什么不同?
好例子,而不是文字。以下代码(如果第一个承诺已解决):
Promise.resolve()
.then
(
() => { throw new Error('Error occurs'); },
err => console.log('This error is caught:', err)
);
等于:
Promise.resolve()
.catch
(
err => console.log('This error is caught:', err)
)
.then
(
() => { throw new Error('Error occurs'); }
)
但与被拒绝的第一个承诺不同,这是不一样的:
Promise.reject()
.then
(
() => { throw new Error('Error occurs'); },
err => console.log('This error is caught:', err)
);
Promise.reject()
.catch
(
err => console.log('This error is caught:', err)
)
.then
(
() => { throw new Error('Error occurs'); }
)
通过观察两者的优点和缺点,我们可以计算出哪种适合这种情况。
这是实现承诺的两种主要方法。两者都有优点和缺点
捕捉方法
some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })
优势
所有错误都由一个catch块处理。
Even捕获then块中的任何异常。
多个成功回调的链接
缺点
在链接的情况下,很难显示不同的错误消息。
成功/错误的方法
some_promise_call()
.then(function success(res) { logger.log(res) },
function error(err) { logger.log(err) })
优势
你得到了细粒度的错误控制。
你可以使用常见的错误处理功能来处理各种类型的错误,比如db错误,500错误等等。
Disavantages
如果希望处理成功回调抛出的错误,仍然需要另一个catch