从承诺链的中间解决

在我的代码中,我使用Q库链接多个API调用,如下所示:

function long_promise_chain() { var q = Q.defer(); call_api_batch1() .then(function(v) { if (v.bar) { q.resolve(); } else { return call_api_batch_2(); } }) .then(function(v) { if (v.bar) { q.resolve(); } else { return call_api_batch_3(); } }) .then(function(v) { if (v.bar) { q.resolve(); } else { return call_api_batch_3(); } }, function(err) { console.log("err: " + err); }); return q.promise } 

我看到,即使链在第一批之后解决了,下一个块也会运行并导致错误 – 尝试访问未定义的variables,然后调用函数(err)块。

你能否提出正确的解决方法?

更新:问题是,如果第一个q.resolve()被调用,我不希望在链中的下一个.then触发。 虽然q.resolve被正确调用并将控制权返回给调用者,但打印错误的原因是,在第二种情况下,testingv时没有“v”,错误是“Can not Read属性栏未定义”。酒吧。

我希望我能理解你。 这是你想要的吗?:

 function long_promise_chain() { var q = Q.defer(); var allDone = false; call_api_batch1() .then(function(v) { if (v.bar) { q.resolve(); allDone = true; } else { return call_api_batch_2(); } }) .then(function(v) { if (!allDone) { if (v.bar) { q.resolve(); allDone = true; } else { return call_api_batch_3(); } } }) .then(function(v) { if (!allDone) { if (v.bar) { q.resolve(); allDone = true; } else { return call_api_batch_3(); } } }, function(err) { console.log("err: " + err); }); return q.promise } 

有两个独立的resolve来处理你的情况。

  1. 首先是包含延迟对象的小写字母q 。 这是你从long_promise_chain返回的承诺。
  2. 其次,在你的每个阶段的承诺链。 也就是说,每一个从这个链中回来的诺言都会回到then

通过直接调用q的方法来解决或拒绝q 。 您可以通过从当前块返回Q.resolve()Q.reject()来解决或拒绝then承诺。

这是一个示例:

最喜欢在我的代码中,我使用Q库链接多个API调用,如下所示:

 function long_promise_chain() { var q = Q.defer(); call_api_batch1() .then(function(v) { if (condition) { q.resolve(); return Q.reject(); } else { return call_api_batch_2(); } }) .then(function(v) { if (condition) { q.resolve(); return Q.reject(); } else { return call_api_batch_3(); } }) .then(function(v) { if (condition) { q.resolve(); return Q.reject(); } else { return call_api_batch_3(); } }, function(err) { console.log("err: " + err); }); return q.promise }