0

私は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()を使用する必要がある場所が見つかりません。誰かが提案を提供してください。

前もって感謝します。

4

2 に答える 2

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この種の問題を解決するためのより一般的な方法であるため、ここで使用しましたが、2つの配列の長さを比較できるため、Ianzzアプローチも問題ありません。

于 2012-06-07T13:24:57.090 に答える
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});
            }
        });
    }
});
于 2012-06-07T13:20:28.657 に答える