我确定我的问题是基于对node.js中的异步编程缺乏了解,但这是可行的。
例如:我有一个要爬网的链接列表。当每个请求都返回时,我想知道它的URL。但是,大概是由于竞争条件造成的,每个请求都将URL返回设置为列表中的最后一个值。
var links = ['http://google.com', 'http://yahoo.com']; for (link in links) { var url = links[link]; require('request')(url, function() { console.log(url); }); }
预期产量:
http://google.com http://yahoo.com
实际输出:
http://yahoo.com http://yahoo.com
所以我的问题是:
PS:对于1.我不想要一种解决方案来检查回调的参数,而是希望回调的一种通用方法是“从上方”了解变量。
您的url变量没有作用于for循环,因为JavaScript仅支持全局和函数作用域。因此,您需要为request调用创建一个函数作用域,url以使用立即函数来捕获循环的每次迭代中的值:
url
for
request
var links = ['http://google.com', 'http://yahoo.com']; for (link in links) { (function(url) { require('request')(url, function() { console.log(url); }); })(links[link]); }
顺便说一句,require在循环中间嵌入a 不是一个好习惯。它可能应该重写为:
require
var request = require('request'); var links = ['http://google.com', 'http://yahoo.com']; for (link in links) { (function(url) { request(url, function() { console.log(url); }); })(links[link]); }