Angular JS Loop承诺

时间:2015-09-02 05:04:12

标签: javascript angularjs sqlite angular-promise

我有一个情况。我有一个以这种方式运行的承诺函数

  1. 我的promise函数“getQuestion”调用另一个promise函数DB.query,它从mysqlite数据库中获取结果(Main_Question)。

  2. 在我得到DB.query的结果后,我调用了getAnswer函数,它也是一个获取该问题答案的promise函数

  3. 现在Main_Question可能有N个子问题。所以我再次运行DB.query来获取所有Sub_Questions。

  4. 现在我必须获取这些Sub_Questions的答案。显然,它只能通过循环来完成。所以我运行一个for循环,循环遍历Sub_Question的每个元素以得到它的答案

  5. 现在问题在于步骤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);
    });
    

1 个答案:

答案 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