如何打破 Promises/A 的处理程序序列?
例如
如果我们有序列:
method1().then(method2())
.then(method3(), errorHandler3());
在method2()中,我们决定打破顺序,不要走得更远,也不要使用method3()或errorHandler3()。我们应该怎么做?
如何打破 Promises/A 的处理程序序列?
如果我们有序列:
method1().then(method2())
.then(method3(), errorHandler3());
在method2()中,我们决定打破顺序,不要走得更远,也不要使用method3()或errorHandler3()。我们应该怎么做?
您可以返回一个永远不会从产生的函数中解决的承诺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());
});
在这种情况下,您应该将逻辑嵌套在传递给 then 的回调中,例如
method1().then(function (value) {
if (method2(value)) return method3();
}).done();
我简化了我的示例,因此它不会从其他函数调用中获取回调(就像在您的代码中一样)。它看起来有点奇怪,而且在 Promise 世界中绝对不常见,你背后的原因是什么?
在评论其他解决方案时,您绝对不应该使用 promise that never resolves。在编写良好的逻辑中,所有承诺都会解决,如果有一些承诺没有解决,则意味着您的逻辑中有错误(这就像创建从不打算调用回调的异步函数,没有意义)。