2015-10-06 58 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