在我的代码中,我使用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
}
我看到即使链在第一批之后被解析,下一个then
块也会运行并导致错误 - 尝试访问未定义的变量然后调用函数(错误)块。 / p>
你能否提出正确的解决方法。
更新: 问题是,如果第一个q.resolve()被调用,我不希望链中的下一个.then被触发。虽然正确调用了q.resolve并将控制权返回给调用者,但是打印时出现错误,因为在第二种情况下,没有' v'并且错误是“无法读取”未定义的属性栏'在测试v.bar时。
答案 0 :(得分:1)
我希望我理解你。这是你想要的吗?:
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
}
答案 1 :(得分:0)
在您的情况下,有两个单独的resolve
来处理。
q
。这是您从long_promise_chain
返回的承诺。 then
调用返回到后续then
的承诺。您可以直接在q
上调用方法来解决或拒绝q
。您可以通过从then
块中返回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
}