Node.js内部循环的http请求

时间:2013-04-24 07:10:56

标签: node.js

我正在尝试定期从外部API加载一些数据,如下所示:

setInterval(function() {
  getData();
}, 60000);

function getData() {
  if (typeof someObject.data === 'object') {
    for (var prop in someObject.data) {
      if (prop === 1 || prop === 2) {
        var options = {
          host: 'somehost.com',
          path: '/somepath?param=' + prop
        };
        var req = http.request(options, function(res) {
          // EXECUTION NEVER REACHES THIS POINT ?!?!
          req.on('end', function() { alert('ended'); });
        });
        req.end();
      }
    }
  }
}

如果我不做任何间隔和循环,对同一主机的这种请求可以完美地工作。但是,如果我尝试执行上面显示的操作,那么请求永远不会调用其回调函数。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为你的一个条件不好,以下对我来说很好。

var http = require('http');

setInterval(function() {
  getData();
}, 1000);

function getData() {
  console.log('get');
  //if (typeof someObject.data === 'object') {
    console.log('get 1');
    //for (var prop in someObject.data) {
      console.log('get 2');
      //if (prop === 1 || prop === 2) {
        console.log('get 3');
        var options = {
          host: 'google.com',
          path: '/'
        };
        var req = http.request(options, function(res) {
          console.log('http request', res.statusCode);
          //req.on('end', function() { 
          //  console.log('ended', req); 
          //});
        });
        req.end();
      //}
    //}
  //}
}

如果我是对的,你不需要req.on('end'),请求的回调在完成时被调用。您也可以使用http.get,因此无需致电req.end

    var req = http.get( options.host, function(res) {
      console.log('http request', res.statusCode);
      //req.on('end', function() { 
      //  console.log('ended', req); 
      //});
    }).on('error', function( e ) {
      console.error( 'error', e );
    }) 

查看docs

中的更多信息 希望我能帮忙。