我有一个情况。我有一个以这种方式运行的承诺函数
我的promise函数“getQuestion”调用另一个promise函数DB.query,它从mysqlite数据库中获取结果(Main_Question)。
在我得到DB.query的结果后,我调用了getAnswer函数,它也是一个获取该问题答案的promise函数
现在Main_Question可能有N个子问题。所以我再次运行DB.query来获取所有Sub_Questions。
现在我必须获取这些Sub_Questions的答案。显然,它只能通过循环来完成。所以我运行一个for循环,循环遍历Sub_Question的每个元素以得到它的答案
现在问题在于步骤4,循环运行良好但不会返回承诺共振,因此我有时会为每个子问题答案得到不正确的值。
这是我的代码
var gcmIds = [ "GCM_ID_1", "GCM_ID_2" ];
var GCM_API_KEY = "MY_API_KEY";
var options =
{
method: 'POST',
uri: 'https://android.googleapis.com/gcm/send',
headers: {
'Content-Type': 'application/json',
'Authorization':'key=' + GCM_API_KEY
},
body: JSON.stringify({
"registration_ids" : gcmIds,
"data" : {
message: "Test Messages"
},
})
}
request(options, function (error, response, body) {
if(error) console.log(error);
console.log("RESPONSE STATUS: " + response.statusCode)
console.log("BODY: " + body);
});
答案 0 :(得分:1)
您必须等待所有承诺才能通过$q.all()
获取你的子答案应该与此类似(我可能用括号弄乱了一些东西):
var subPromises = [];
for (var i in question.sub)
{
console.log("i+"+i);
(function(j) {
console.log("j+"+j);
question.sub[j].answer = {};
var subPromise = Answer.getAnswer(question.sub[j].question_id).then(function(res) {
question.sub[j].answer = res;
});
subPromises.push(subPromise);
})(i);
}
$q.all(subPromises).then(function() {
deferred.resolve(question);
});
另外,请检查一下:Wait for all promises to resolve。