在回调期间获取正确的循环值

时间:2014-01-21 07:27:57

标签: node.js for-loop callback

我正在尝试轮询多个站点,但是当我尝试打印数组索引时,它不会返回真正的索引。

   var request = require('request');
var opt=['https://dev.twitter.com','https://developer.foursquare.com/','https://developers.facebook.com'];
function req()
{
for(i=0;i<opt.length;i++)
{

request(opt[i], function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log("Yes "+i)
  }
  else
    console.log("No");
})
}
}
setInterval(req,3000);

问题是什么?

1 个答案:

答案 0 :(得分:2)

您正在循环中执行异步函数调用。这意味着循环将在处理请求时继续,并将导致错误的循环索引。

如果要获得正确的索引,则必须使函数调用同步,或者必须控制函数的流程。

您可以使用模块async

执行此操作

这是一个例子。

var request = require('request')
 , async = require('async');

var opt = ['https://dev.twitter.com','https://developer.foursquare.com/','https://developers.facebook.com'];

function req() {

    var count = 0;

    // Use async to loop each opt value in series
    async.eachSeries(opt, function(entry, callback) {
        count++;

        request(entry, function(error, response, body) {
            if (!error && response.statusCode == 200) {
                console.log('Yes ' + count)
            }
            else {
                console.log('No');
            }

            callback(); 
        });
    }, function(err) {
         console.log('We are done!');
    });
}

setInterval(req,3000);