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

时间:2013-06-03 17:23:12

标签: javascript asynchronous promise

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

例如

如果我们有序列:

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

并且在 method2()中我们决定打破序列,不要走得更远,也不要走 method3() errorHandler3()。我们该怎么做?

2 个答案:

答案 0 :(得分:4)

您可以从method2()产生的函数返回永远不会解析的承诺。

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

也许你想要

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());
});

答案 1 :(得分:2)

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

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

我简化了我的示例,因此它不会从其他函数调用中获取回调(因为它在您的代码中)。它看起来有点奇怪,绝对在承诺世界中并不常见,你背后的理由是什么?

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