Azure Javascript -等待函数完成

Azure Javascript - Wait for Function Completion

本文关键字:函数 等待 Javascript Azure      更新时间:2023-09-26

我正在使用Azure移动服务,并运行javascript后端。然而,由于后端是在node.js中,一切都是异步执行的,我不知道如何停止函数的执行。

如果在过去24小时内没有评论,我试图删除一个俱乐部,下面是我的代码:

var clubs = tables.getTable('Club');
clubs.read(
    {
        success: function(club){
            var now = new Date().getTime();
            for(var i=0;i<club.length;i++){
                var deleteClub = true;
                comments.where({ClubId: club[i].id}).read(
                    {
                        success:function(comment){
                            var timeDiff = (now-comment[i].Time.getTime())/(1000*60*60);
                            console.log("Comment in table: "+timeDiff);
                            if(timeDiff<24){
                                deleteClub=false;
                            }
                        }
                    }
                );
                if(deleteClub){
                    console.log("deleting club: "+club[i].Title);
                    //clubs.del(club[i]);
                }else{
                    console.log("saving club: "+club[i].Title);
                }
            }
        }
    }
);

if语句在delete club变量更新之前执行,所以它总是为真,但是我需要将if语句的执行延迟到所有注释都循环完之后。

由于您获得的回调是异步的,因此您不能在where调用后的同步代码中使用回调中获得的任何信息。

因为我们想要逐个俱乐部地处理事情,所以首先我们将俱乐部的处理移到它自己的函数中。这避免了当我们从read获得回调时,i将被增加的问题。

您的代码似乎假定反复调用success,每个注释调用一次。我不认为这是可能的情况,更可能的是它被称为一次,与匹配注释的列表/数组。

如果是这样,那么将俱乐部处理分离到它自己的函数,然后循环找到的注释应该这样做:

var clubs = tables.getTable('Club');
clubs.read(
    {
        success: function(allClubs){ // <== Note plural
            var now = new Date().getTime();
            for (var i = 0; i < allClubs.length; i++) {
                handler(now, allClubs[i]); // <== Move handling off to a handler
            }
        }
    }
);
function handler(now, club) {   // <== Unlike `i` above, `club` won't change because it's
                                // a function argument that we never assign to
    comments.where({ClubId: club.id}).read(
        {
            success: function(comments){ // <== Note the plural
                var deleteClub = true;
                for (var i = 0; i < comments.length; ++i) {
                    var timeDiff = (now-comments[index].Time.getTime())/(1000*60*60);
                    console.log("Comment in table: "+timeDiff);
                    if(timeDiff<24){
                        deleteClub=false;
                    }
                }
                if (deleteClub){
                    console.log("deleting club: "+club.Title);
                    //clubs.del(club);
                }else{
                    console.log("saving club: "+club.Title);
                }
            }
        }
    );
}