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
所以我的问题是:
- 如何将URL(通过值)传递给callback函数? 要么
- 链接HTTP请求的正确方法是什么,使它们顺序运行? 要么
- 还有什么我失踪?
PS:对于1.我不想要一个解决scheme,检查callback的参数,而是一个callback的一般方式知道variables'从上面'。
你的url
variables没有作用于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)); }