2015-10-06 57 views
0

我正在使用Azure移动服务,并且正在运行一个javascript后端。但是,由于后端在node.js中,所有内容都是异步执行的,我不知道如何中止函数的执行。Azure Javascript - 等待功能竣工

我想删除一个俱乐部,如果有尚未过去的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语句的执行,直到所有的注释都被循环遍历。

+1

什么你不能把你的''deleteClub'回调success'里面? – Rayon

+0

成功回调发生每个评论被检索,我需要检查通过所有的意见之前调用删除功能。 – Oblivionkey3

+0

我很困惑:它有一个'长度'并且你指向它的'俱乐部'是什么?你如何使用'club'使用的索引,并用它来索引到'comment'?异步问题很容易解决,但我没有得到整个代码... –

回答

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); 
       } 
      } 
     } 
    ); 
} 
+0

如果我只是在做一个阅读查询,这将工作,但我不知道将发生的回调数量,因为我使用了一个过滤器,其中ClubId必须等于club [i] .id。 – Oblivionkey3

+0

@ Oblivionkey3:必须提供API提供的整体“立即完成”回调。 –

+0

我希望,不幸的是azure的javascript后端API是最小的,我试着调用read(..,)。done(func(){}); ,但是会引发错误。这里有一个链接到文档:https://msdn.microsoft.com/en-us/library/azure/jj554226.aspx – Oblivionkey3