使用Node Js Q promise库.finally()和.done()语句有什么区别。
例如,这两者之间的区别是什么?
Q(...)
.then(...)
.finally(); //or fin()
Q(..)
.then()
.done();
答案 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
投掷时不会运行,并且如果它以异常结束则会记录错误。