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

Tod*_*uhm 10 javascript node.js promise q

使用Nodejs Q promise库的.finally()和.done()语句有什么区别.

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

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

Q(..)
.then()
.done();
Run Code Online (Sandbox Code Playgroud)

Mar*_*wak 18

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

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


Ben*_*aum 9

不同之处在于链接和错误处理以及错误记录:

Q(...)
.then(...) 
.finally();
Run Code Online (Sandbox Code Playgroud)

在这里,如果then抛出,finally仍然会运行,但没有错误会记录.在Q finally中运行,无论.then是否成功.这就像finallyJS中的关键字一样try/catch/finally.then在这种情况下,还可以将额外的链连接到链上.

Q(..)
.then()
.done();
Run Code Online (Sandbox Code Playgroud)

在这里,done表明承诺链已经结束,你不能再链接到它了.如果你只传递一个onFulfilled处理程序,它将在then抛出时不会运行,并且如果它以异常结束它将记录错误.