nodejs推送到内部数组for for循环请求

时间:2017-01-07 06:38:44

标签: javascript node.js

从没有任何异步知识的Node开始,我想知道如何将数据作为回调的一部分推送到数组中。声明了输出数组,但在请求回调中引用它时未定义。有一种简单的方法可以将该变量传递给回调函数范围吗?

理想情况下,我想将每个请求的结果数组发回给调用者。

const request = require('request');

module.exports = {

apiRatingCall: function (input, callback) {

var output = []

  for (var i = 0; i < input.length; i++) {
  var options = {
    url: 'someAPIURL' + '?longitude=' + input[i].longitude + '&latitude=' + input[i].latitude + '&name=' + input[i].name,
    headers: {
      'x-api-version': 2
    }
  };

  request(options, function (error, response, body) {
    if (!error && response.statusCode == 200) {

      var info = JSON.parse(body)
      output.push(info) // this is not working as ouput is undefined at this point
    }
  })
  }
  callback(output)
  }
}

由于

3 个答案:

答案 0 :(得分:0)

您可以查看for循环结束并执行callback

var loopCallback = function(error, response, body) {
  if (!error && response.statusCode == 200) {
     var info = JSON.parse(body)
     output.push(info)
  }
  if( i == input.length - 1){ //checking index for completion of loop
    callback(output);
  }
}

request(options, loopCallback})

答案 1 :(得分:0)

我的答案在编程中可能不是很规范,因为这是我承诺的这个问题的唯一方法

module.exports = {

apiRatingCall: function (input, callback) {

var output = []

for (var i = 0; i < input.length; i++) {
var options = {
  url: 'someAPIURL' + '?longitude=' + input[i].longitude + '&latitude=' +    input[i].latitude + '&name=' + input[i].name,
 headers: {
  'x-api-version': 2
 }
};

 request(options, function (error, response, body) {
   if (!error && response.statusCode == 200) {

    var info = JSON.parse(body)
    output.push(info) // this is not working as ouput is undefined at this    point
   }
 })
 }
 setTimeout(function(){
   callback(output)
 },500)

 }
}

答案 2 :(得分:0)

看一下异步模块。如果你不想使用蓝鸟和承诺,那么使用数组和集合进行异步操作是一个很好的模块。

执行npm install async -S。

const request = require('request');
const async = require('async);

module.exports = {

  apiRatingCall: function (inputs, callback) {

  var output = []


  async.each(inputs, function(input, cb) {
      var options = {
      url: 'someAPIURL' + '?longitude=' + input.longitude + '&latitude=' + input.latitude + '&name=' + input.name,
      headers: {
       'x-api-version': 2
      }
      request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {

          var info = JSON.parse(body)
          output.push(info); 
          cb();
        }else{
          //if any of the request fails then return error
          cb(error);
        }
    })

    }, function(err){
      if(!err){
         return callback(output);
      }else{
        //if any of the request return error
        return callback(err);
      }
   });
}