在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); 

这是什么问题?

你正在做一个循环中的asynchronous函数调用。 这意味着循环将继续处理请求,并将导致错误的循环索引。

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

你可以用模块asynchronous来做到这一点

这里是一个例子。

 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);