Q Promise库.finally()和.done()之间有什么区别?

时间:2014-09-25 05:12:34

标签: javascript node.js promise q

使用Node Js Q promise库.finally()和.done()语句有什么区别。

例如,这两者之间的区别是什么?

Q(...)
.then(...)
.finally(); //or fin()

Q(..)
.then()
.done();

2 个答案:

答案 0 :(得分:18)

promise.done(onSuccess, onError)只允许您处理已解决的值。另一个好处是,并不意味着任何吞咽错误(就像promise.then()的情况一样),它保证会暴露任何涉及的异常。它也有效地结束了链条,并没有再回复任何承诺。

promise.finally(fn)用于注册必须在给定的promise解决后完成的任务(无论promise是成功还是失败都无关紧要)。通常,您将它用于某种清理操作,例如想象一下你设置了一个进度条,需要在请求完成后隐藏(无论它是否成功),然后只做promise.finally(hideProgressBar)。另外promise.finally()返回输入承诺,因此您可以将其返回以进行进一步处理。

答案 1 :(得分:9)

区别在于链接和错误处理以及错误记录:

Q(...)
.then(...) 
.finally();

在这里,如果then抛出,finally仍将运行,但不会记录任何错误。无论finally是否成功,Q .then都会运行。这类似于JS finally中的try/catch/finally关键字。在这种情况下,还可以将其他then链连接到链。

Q(..)
.then()
.done();

此处,done表示承诺链已结束,您无法再链接到它。如果只传递一个onFulfilled处理程序,它将在then投掷时不会运行,并且如果它以异常结束则会记录错误。