【问题标题】:How to break sequence handlers of Promises/A?如何打破 Promises/A 的序列处理程序?
【发布时间】:2018-11-22 13:36:12
【问题描述】:

如何打破 Promises/A 的处理程序序列?

例如

如果我们有序列:

method1().then(method2())
         .then(method3(), errorHandler3());

method2()中,我们决定打破顺序,不走更远,也不去method3()errorHandler3()。我们应该怎么做?

【问题讨论】:

  • 如果你的函数没有返回另一个函数,你就不应该初始化它们。 (then(method2()) -> then(method2)?)
  • 您确定在那里调用了method2method3errorHandler3 函数(而不是作为处理程序传递)?
  • @Bergi 如果你问我上面的评论,那么是的..??

标签: javascript asynchronous promise


【解决方案1】:

你可以返回一个永远不会从method2() 产生的函数中解析的promise。

但是,这没有多大意义,因为“破坏序列”实际上意味着进入错误状态,并且应该可以处理。

也许你更愿意

method1().then(function method2(res) {
    // do something
    if (/* you want to break*/)
        throw new Error("reason for breaking");
    else
        return when(/* what is done */).then(method3(), errorHandler3());
});

【讨论】:

  • 是的,never-resolved-promises 可以解决问题。但它似乎更像是 stuck-forever 这肯定会导致内存泄漏。
  • 但是打破序列永远卡住吗?不知道你为什么想要那个。顺便说一句,永远不会解决的承诺应该是可回收的,因为内存中没有任何东西可以解决它。
  • 是的,如果 Promises 可以处理此类问题,throw exception 可能是一个关键。
  • 使用 never-resolved-promises,我们需要从 method2() 返回它,这样它就会被序列化的 Promises 锁定。
  • “可以处理”是什么意思?指定了符合 Promise/A 的实现。 “锁定”是什么意思?如果没有任何内容引用承诺链,它将被收集。
【解决方案2】:

在这种情况下,您应该将逻辑嵌套在传递给 then 的回调中,例如

method1().then(function (value) {
  if (method2(value)) return method3();
}).done();

我简化了我的示例,因此它不会从其他函数调用中获取回调(就像在您的代码中一样)。看起来有点怪,在promise的世界里肯定不常见,你的理由是什么?

评论其他解决方案,你绝对不应该使用永远不会解决的promise。在编写良好的逻辑中,所有承诺都会解决,如果有一些承诺没有解决,则意味着您的逻辑中有错误(这就像创建从不打算调用回调的异步函数,没有意义)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2015-05-25
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多