小编典典

Node.JS:如何将变量传递给异步回调?

node.js

我确定我的问题是基于对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

所以我的问题是:

  1. 如何将url(按值)传递给回调函数?要么
  2. 链接HTTP请求以使其顺序运行的正确方法是什么?要么
  3. 我还缺少什么?

PS:对于1.我不想要一种解决方案来检查回调的参数,而是希望回调的一种通用方法是“从上方”了解变量。


阅读 216

收藏
2020-07-07

共1个答案

小编典典

您的url变量没有作用于for循环,因为JavaScript仅支持全局和函数作用域。因此,您需要为request调用创建一个函数作用域,url以使用立即函数来捕获循环的每次迭代中的值:

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 不是一个好习惯。它可能应该重写为:

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]);
}
2020-07-07