2017-03-02 29 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将根据文档接受一个对象 - 这个答案中有很多细节没有解释它是如何为你工作的! –

相关问题