节点JS范围 - 尝试执行GET请求并将响应写入数组

时间:2016-01-04 13:40:02

标签: javascript arrays node.js scope

节点JS范围,尝试执行GET请求并将响应写入数组,但似乎数组在函数中不可见。

var stats = [];

for(var i = 0; i<tempBackends.length; i++)
{

    http.get(tempBackends[i], function(res) {

        console.log("Received response: " + res.statusCode);

        if(res.statusCode == 200) {
            stats.push('OK');
            console.log('pushed OK\n');
        }
        else {
            stats.push('Not OK');
            console.log('pushed Not OK\n');
        }
    });
} 

3 个答案:

答案 0 :(得分:0)

循环异步调用不会很好,因为你不知道什么时候完成并且填充了rest-api-framework数组。你需要一些额外的机器来处理这个问题。不使用SOA或承诺,基本思路是:

stats

但是,使用此方法,async数组将不会与var stats = []; var finishedCount = 0; // keep track of how many callbacks have completed for (let i = 0; i<tempBackends.length; i++) { http.get(tempBackends[i], function(res) { console.log("Received response: " + res.statusCode); if(res.statusCode == 200) { stats.push('OK'); console.log('pushed OK\n'); } else { stats.push('Not OK'); console.log('pushed Not OK\n'); } // ADD LOGIC HERE TO HANDLE ALL CALLBACKS HAVING FINISHED finishedCount++; if (finishedCount === tempBackends.length) { console.log("ALL DONE!! stats is", stats); } }); } 对齐。 stats中值的顺序将基于异步调用的完成顺序。此外,这种代码风格很难维护。相反,您应该使用tempBackends或承诺。 stats方法是:

async

承诺方法更具可读性和可写性。首先,制作async的宣传版:

async.map(
  tempBackends, 
  function(backend, callback) {
    http.get(backend, function(res) {
      callback(null, res.statusCode === 200 ? "OK" : "Not OK");
    });
  function(err, data) {
    console.log("ALL DONE!! stats is", data);
  }
);

现在你可以写

http.get

答案 1 :(得分:0)

var http = require('http');

var list = ['http://rest-service.guides.spring.io/greeting',
            'http://rest-service.guides.spring.io/greeting',
            'http://rest-service.guides.spring.io/greeting',
            'http://rest-service.guides.spring.io/greeting',
            'http://rest-service.guides.spring.io/greeting'];

var responseArray = [];

var calls = function(){
  var index = 0;
  var callWithIndex = function (i){
    http.get(list[i], function(apiResponse) {
      var statusCode = apiResponse.statusCode;

      apiResponse.on('data', function(chunk) {

      });

      apiResponse.on('end', function() {
        responseArray.push(statusCode);

        i += 1;

        if(i < list.length){
          callWithIndex(i);
        } else {
          console.log(responseArray.toString());
        }

      });

    });
  };
  callWithIndex(index);
};

calls();

如果你搞乱了nodejs,你应该知道应该在下一次迭代时执行哪个回调以及何时应该处理数据。注意我是如何在response.on('end')部分中调用下一个迭代的,以及我如何将statusCode推送到那里的数组。

答案 2 :(得分:-2)

尝试在函数内部传递数组变量stats,因为函数的范围是本地的。

http.get(tempBackends[i], function(res,stats) { // access stats here now }