Node.JS:如何将variables传递给asynchronouscallback?

我确定我的问题是基于对node.js中asynchronous编程的理解不足,但是在这里。

例如:我有一个我想要抓取的链接列表。 当每个asynchronous请求返回时,我想知道它是哪个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 

所以我的问题是:

  1. 如何将URL(通过值)传递给callback函数? 要么
  2. 链接HTTP请求的正确方法是什么,使它们顺序运行? 要么
  3. 还有什么我失踪?

PS:对于1.我不想要一个解决scheme,检查callback的参数,而是一个callback的一般方式知道variables'从上面'。

你的urlvariables没有作用于for循环,因为JavaScript只支持全局和函数作用域。 所以你需要为你的request调用创build一个函数作用域,通过使用一个直接函数来捕获循环的每次迭代中的url值:

 var links = ['http://google.com', 'http://yahoo.com']; for (link in links) { (function(url) { require('request')(url, function() { console.log(url); }); })(links[link]); } 

顺便说一句,在循环中embedded一个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]); } 

检查这个博客 。 一个variables可以通过使用.bind()方法传递。 在你的情况下,会是这样的:

 var links = ['http://google.com', 'http://yahoo.com']; for (link in links) { var url = links[link]; require('request')(url, function() { console.log(this.urlAsy); }.bind({urlAsy:url})); } 

有关此问题的一般性讨论,请参阅https://stackoverflow.com/a/11747331/243639

我会build议类似的

 var links = ['http://google.com', 'http://yahoo.com']; function createCallback(_url) { return function() { console.log(_url); } }; for (link in links) { var url = links[link]; require('request')(url, createCallback(url)); }