2017-07-24 43 views
0

我在for循環中有一個rest.get請求,它發送大約20個查詢(基於前一個請求中的數據每次查詢)。我的問題是,它似乎是完全通過運行for循環,然後查詢異步運行,並與返回最快,而不是連續返回的數據響應。如果我console.log在.end函數內的forloop的索引,它是undefined,直到forloop完成,然後它是最後一個數字(即使它全部在for循環內)。我試圖按照與發送請求相同的順序保存(推送到數組)數據,因此我可以將數據與先前打印出來的獲取響應列表進行匹配。有沒有辦法將我的響應數據按照發送請求的順序分配給數組,而不是先到先得?如何將我的獲取響應數據按照我發送請求的順序分配給數組

// this function is being called inside the previous query 
function carData(req, res) { 

    var carNameJson = []; 
    var resultToJson = []; 

    //singleCars.length is defined in a previous query and is an array of car IDs 
    for (var index = 0; index < singleCars.length; ++index) { 
    //Grab each individual car ID and concatinate it into a Query 
    var carNames = singleCars[index]; 
    var carQuery = "https://queryinfo"; 
    var finalSingleQuery = "carQuery + carNames"; 

    // puts the data into an array of JSON objects 
    carNameJson = { 
     carID: carNames 
    }; 

    // result is a global variable assigned as an empty array 
    // it list all the car IDs in a JSON format 
    result.push(carNameJson); 

    rest 
     .get(finalSingleQuery) 
     .proxy("http://proxyinfo") 
     .end(function(resp) { 
     resultToJson = { 
      carInfo: resp.body 
     }; 
    // resultInfo is a global variable assigned as an empty array 
     resultInfo.push(resultToJson); 
     return resultToJson; 
     }); 
    } 
} 

此代碼全部有效,但它給我的數據亂序,所以我無法將汽車信息匹配到汽車ID列表。我對節點很陌生,所以我可能會做這一切都是錯誤的。任何幫助,將不勝感激!

+0

什麼發送當前時間戳與每個請求,這propogates到響應,然後通過時間戳的響應進行排序。 – Bango

+0

如何在回覆中返回ID,以便將它們匹配起來? – ADyson

+0

@ADyson如何在回覆中返回ID?每次我嘗試通過傳遞前一個響應中的當前請求來訪問變量(甚至是全局變量)時,我都會得到未定義的變量。 – cheesydoritosandkale

回答

1

您可以使用索引變量來定位響應的存儲位置。對於您必須確保index變量是本地for身體,你可以用let(而不是var)實現:

for (let index = 0; index < singleCars.length; ++index) { 

    // ... 

    // store directly at the correct index: 
    resultInfo[index] = resultToJson; 

您可能也有興趣知道,當你有所有結果。這你可以用這個條件去做,只是分配給resultInfo[index]後:

if (resultInfo.filter(Object).length === singleCars.length) { 
     // maybe call a callback here. 
    } 
+0

這工作!!!!!!!!!!謝謝!!!!!!!! – cheesydoritosandkale

+0

我試過'if(resultInfo.filter(Number).length === singleCars.length){ //可能在這裏調用回調函數。 }'但是resultInfo.filter(Number).length總是返回0. – cheesydoritosandkale

+0

Object.keys(resultInfo).length工作= D – cheesydoritosandkale

1

您正在for循環內執行寧靜的響應。相反,請考慮構建一個完整的JSON對象,其中包含客戶端需要的所有數據(換句話說,將其全部發送爲1個大響應,而不是很多小響應)。

使用for循環來構建JSON,然後在循環之外執行您的1次寧靜響應。

這樣你就不必擔心數據通過不按順序傳遞,響應是完整的,並且不會丟失索引等重要信息。

+0

這會使它同步嗎?我們?我需要它同時運行所有20個請求。 – cheesydoritosandkale

+1

爲什麼需要20個請求而不是1個請求。不,它仍然是異步的。該頁面不必重新加載以獲取新數據。 – Bango

+0

carID每次請求都會改變,所以每次都不會有不同的請求嗎? – cheesydoritosandkale

相關問題