我正在使用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语句在更新删除俱乐部变量之前执行,因此它始终为真,但我需要延迟if语句的执行,直到所有注释都循环完毕为止。
答案 0 :(得分:1)
由于您获得的回调是异步的,因此您无法在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);
}
}
}
);
}