解析云代码延迟for循环的每个迭代

时间:2016-03-23 07:07:12

标签: javascript for-loop parse-platform promise cloud-code

我需要在ParseObjects列表上运行一个函数,但由于我的progressTournament函数是异步的,所以:

答:取消对progressTournament的任何现有调用 B:过早地返回status.success。

我的理解是,我需要让progressTournament返回一个承诺,并以某种方式延迟我的代码,直到该承诺得到解决,但我对承诺的理解太有限,无法弄清楚如何实现它。

我真的很感激这方面的一些帮助,希望很快能收到某人的回复。

后台职位代码

Parse.Cloud.job('progressTournaments', function(request, status)
{
    var tournamentsQuery = new Parse.Query('Tournament');
    tournamentsQuery.lessThan('nextRoundTime', moment().toDate());

    console.log('Finding tournaments that are due to progress...');
    tournamentsQuery.find(
    {
        success: function(results)
        {
            console.log('Progressing ' + results.length + 'tournaments')

            for (var i = 0; i < results.length; i++)
            {
                progressTournament(results[i], null);
                // Wait here until progressTournament finishes!
            }

            status.success();
        },
        error: function(error)
        {
            status.error();
        }
    });
});

1 个答案:

答案 0 :(得分:0)

能够使用Parse.Promise.when()

实现我想要的效果
tournamentsQuery.find(
function(tournaments)
{
    var promises = [];

    for (var i = 0; i < tournaments.length; i++)
        promises.push(tournamentUtils.progressTournament(tournaments[i]));

    return Parse.Promise.when(promises);
}).then(
function(progressedTournaments)
{
    response.success("All tournaments progressed");
},
function(error)
{
    response.error(error);
});

如果需要按顺序而不是并行完成,可以使用Parse.Query.each()代替

应该注意,自从此问题发布以来,现在使用响应而不是状态迁移到自托管解析服务器。