2012-06-07 184 views
0

我是nodejs.js的新手,很難在nodejs級別處理回調。我有這樣的代碼,處理nodejs中的異步回調

getItems(request,function(jsonObject){ 
    var itemData={}; 
    var itemDetails=new Array(); 
    for(var i=0;i < jsonObject.length;i++){ 
     getItemDetails(jsonObject[i].value.item_id,function(jsonObject){ 
      itemDetails.push(jsonObject); 
     }); 
    } 
    itemData["itemDetails"]=itemDetails; 
    response.contentType("application/json"); 
    response.send({"data":itemData}); 
}); 

在執行上面的代碼中,for循環與從出方法getItemDetails和響應發送到客戶端獲得回調繼續。我的要求是循環將等待,直到從getItemDetails獲得回調,然後響應應該發送。 我試着用process.nextTick(),但我無法找到我必須使用process.nextTick()..請有人提供建議。

在此先感謝。

回答

1

您需要發送後,才獲得所有項目的反應,所以修改您的代碼如下所示:

getItems(request,function(jsonObject) { 
    var itemData = {}, 
     itemDetails = [], 
     itemsLeft = len = jsonObject.length, 
     i; 

    function sendResponse(itemDetails) { 
     itemData["itemDetails"] = itemDetails; 
     response.contentType("application/json"); 
     response.send({ "data": itemData }); 
    } 

    for (i = 0; i < len; i++) { 
     getItemDetails(jsonObject[i].value.item_id, function(jsonObject) { 
      itemDetails.push(jsonObject); 
      // send response after all callbacks have been executed 
      if (!--itemsLeft) { 
       sendResponse(itemDetails); 
      } 
     }); 
    } 
}); 

注:我用itemLeft在這裏,因爲這是解決這些類型的問題一個更通用的方法,但是Ianzz方法也行,因爲你可以比較兩個數組的長度。

+0

更改代碼後,我仍然面臨同樣的問題。至少它不檢查if條件,直接改變i值並繼續進一步的陳述。 – Aruna

+0

我的不好,它實際上是'--itemsLeft',現在就試試。 – alessioalex

+0

謝謝Alessioalex。現在正在工作。 – Aruna

0

你不能得到循環等待,但你可以修改代碼來獲取行爲,你期待:

getItems(request,function(outerJsonObject){ 
    var itemData={}; 
    var itemDetails=new Array(); 
    for(var i=0;i < outerJsonObject.length;i++){ 
     getItemDetails(jsonObject[i].value.item_id,function(innerJsonObject){ 
      itemDetails.push(innerJsonObject); 
      if (itemDetails.length == outerJsonObject.length) { 
       // got all item details 
       itemData["itemDetails"]=itemDetails; 
       response.contentType("application/json"); 
       response.send({"data":itemData}); 
      } 
     }); 
    } 
});