2017-03-02 31 views
0

我有一個問題,即在nodejs中循環獲取apis請求。我想從多個端點獲取數據,並在所有請求完成時繼續。我嘗試了這樣的東西,但它運行異步並記錄一個空數組。任何提示如何知道所有請求都準備好的時候?從API獲取數據,並在完成後繼續

var api_endpoints = { "1": "url1", "2": "url2", "3": "url3" }; 

var allApiSources = []; 
_.each(api_endpoints, function (val, key) { 
    request(val, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
      var data = JSON.parse(body); 
      _.each(data.url, function (val, key) { 
       allApiSources.push(value); 
      }); 
     } 
    }); 
}); 
console.log(allApiSources); // [] 

謝謝!

+0

1.使用承諾或2.使用asyncjs或3,用一個計數器來統計有多少值已經被推到了陣列,而當他們都做了,你將擁有所有數據(雖然,我也不會推到數組,如果順序很重要 - 因爲異步代碼是異步) –

+0

順序並不重要在這裏:) –

+0

我真的不能使用,因爲量的計數器價值觀是動態的,經常變化。 –

回答

2

使用promisesObject.values

一個假設... data.url是一個對象,而不是一個數組

另一個假設是在原始代碼allApiSources.push(value);應該已經allApiSources.push(val);

var api_endpoints = { "1": "url1", "2": "url2", "3": "url3" }; 

Promise.all(Object.values(api_endpoints).map(value => new Promise((resolve, reject) => { 
    request(value, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
      var data = JSON.parse(body); 
      // you can remove the Object.values call if data.url is an Array 
      return Object.values(data.url); 
     } 
     reject(error || response.statusCode); 
    }); 
}))) 
.then(results => [].concat(...results)) // flattens the array of arrays 
.then(allApiSources => { 
    console.log(allApiSources); 
}); 
+0

感謝這看起來很有希望:) –

+0

啊啊啊,我看你做了什麼,有:P –

0

您需要使用異步NPM,因爲調用是異步的,你將無法打印值,異步模塊可以讓你運行多個異步調用,然後映射resul噸至單個陣列

http://caolan.github.io/async/

async.map(['url1','url2','url3'], request, function(err, allApiSources) { 
     console.log(allApiSources); // [] 

    // allApiSources is now an array of responses for each request 
}); 
+0

哇...異步處理response.statusCode,解析身體,並提取值你!多聰明! –

+0

hehe..also是否有一種方法可以從數組/對象中獲取映射值,或者是否必須手動將所有url都寫入到那裏? –

+0

async.map將根據文檔接受一個對象 - 這個答案中有很多細節沒有解釋它是如何爲你工作的! –

相關問題