2014-04-23 53 views
0

我從我的azure移動服務db獲取數據。在讀取腳本中,我試圖修改響應,如http://msdn.microsoft.com/en-us/library/jj631631.aspx所示。我正在使用結果中找到的跟蹤號碼來使用名爲「ups_node」的節點模塊。我將狀態屬性添加到我的結果中以將包傳遞給客戶端。這一切工作,直到我循環的結果。在繼續循環之前,它不會等待confirmTracking.makeRequest方法完成。因此,如果循環中有一條記錄,則在追蹤請求返回之前它已完成。我不知道如何同步所有內容。暫停foreach循環,以便完成請求並返回值

function read(query, user, request) { 
    request.execute({ 
     success: function (results) { 
      results.forEach(function (item) { 
       var tn = item.trackingnumber; 
       //below request being made for shipping status given the tracking number     
       confirmTracking.makeRequest({ 
        customerContext: "Customer Data", 
        trackingNumber: tn 
       }, function (data, err) { 
        if (err) { 
         console.error(e); 
         request.respond(500, err); 
        } 
        if (data) { 
         var db = SpahQL.db(data); 
         var all_desc = db.select(
          "/TrackResponse/Shipment/0/Package/0/Activity/0/Status/0/StatusType/0/Description" 
         ); 
         var resp = {}; 
         try { 
          var strParse = JSON.stringify(all_desc.value()); 
          resp = JSON.parse(strParse); 
         } catch (e) { 
          // An error has occured, handle it, by e.g. logging it 
          console.log(e); 
          request.respond(500, e); 
         } 
         var status = JSON.stringify(resp); 
         item.Status = resp[0]; 
         console.log('item.Status = ' + item.Status); // this is being called after the one out side the confirmTracking.makeRequest method. 
        } 
       }) 
       //above request is being made for shipping status given the tracking number 
       console.log('item.Status = ' + item.Status); //this is happening before it is being set in the above confirmTracking.makeRequest method therefore it is undefined 
      }); 
      request.respond(); //Writes the response 
     } 
    }); 
} 

回答

1

你必須要小心使用Node.js的異步調用的時候,因爲你你的意思是之前就會在不經意間做出反應,你是如何處理request.respond。如果我明白你上面想要做的事情,你正在執行請求,然後你想要遍歷每個結果並在其上調用confirmTracking.makeRequest。因此,每次調用makeRequest時都會創建一個單獨的進程。只要最後一條記錄被forEach調用命中,就會調用你在底部的request.respond()。這意味着您的READ腳本將在調用makeRequest之前響應調用應用程序。

你需要做的是有點複雜,但通過移除request.respond()的調用開始。事情完成後,您只需要調用一次。爲了知道事情已經完成,您需要跟蹤已經完成了多少請求。所以你會想要做這樣的事情:

success: function (results) { 
    var recordCount = results.length; 
    var recordsProcessed = 0; 
    results.forEach(function(item) { 
     confirmTracking.makeRequest({...} 
     , function(data, err) { 
      recordsProcessed++; 
      //DoProcessingHere 
      //Only call request.respond if recordsProcessed == recordCount 
     }) 
    }) 
}