【问题标题】:Whats the difference between Q Promise library's .finally() and .done()?Q Promise 库的 .finally() 和 .done() 有什么区别?
【发布时间】:2014-11-19 18:41:07
【问题描述】:

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

比如这两者有什么区别?

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

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

【问题讨论】:

  • 你传递给.then.finally.done的参数是什么?
  • 我已经阅读了文档,但我自己并没有发现答案如此明显。
  • promise 现在是 JS 规范的一部分,是 ECMAScript 2015 (ES6) 标准的一部分。

标签: javascript node.js promise q


【解决方案1】:

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

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

【讨论】:

  • 感谢您的澄清!
  • .catch 和 .fail 方法有什么区别?
  • .catch(cb).then(null, cb) 的别名。虽然.fail 从未真正适应过 Promise A+ 库。我认为 Q 在 catch 被创造出来之前就已经有了它,并且它完成了 catch 现在所做的事情。在 jQuery 中 fail 只采用失败回调 done 样式(没有隐含的错误吞咽)。在我的实现中,我考虑添加 .fail(cb) 作为 .done(null, cb) 的别名 -> github.com/medikoo/deferred/issues/35
  • 我喜欢 [www.promisejs.org](promisejs.org#then) 部分关于转换/链接的类比:“简单地说,.then.done,就像 .map 是 @ 987654340@。换一种说法,当你打算对结果做某事时使用.then(即使那只是等待它完成),当你不打算做任何事情时使用.done结果。”
【解决方案2】:

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

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

在这里,如果then 抛出,finally 仍将运行,但不会记录错误。无论.then 成功与否,Q 中的finally 都会运行。这就像 JS try/catch/finally 中的 finally 关键字。在这种情况下,也可以将额外的thens 链接到链中。

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

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

【讨论】:

    猜你喜欢
    • 2017-04-29
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2017-02-06
    • 2011-11-30
    • 2016-09-18
    • 2019-01-20
    相关资源
    最近更新 更多