This question already has answers here:
JavaScript closure inside loops – simple practical example
                                
                                    (44个答案)
                                
                        
                                6年前关闭。
            
                    
这是在Node.js crawler上运行的简化代码,它获取所有数据。
但是,我该如何在循环中插入“回调”:var“ i”的函数值for(var i = 0 ...,当我添加名称:datas [i] .name时,它返回错误:

TypeError:无法读取未定义的属性“未定义”

var Crawler = require("crawler").Crawler;
var crawler = new Crawler;

var datas  = [
{name: 'John', url: 'john025'},
{name: 'Jim', url: 'jim04567'}
];

function crauler(done) {
for (var i = 0; i < datas.length; i++) {
    var link = 'http://somesite.com/' + datas[i].url;
    crawler.queue([{
        "uri": link,
            // inside this func
                        "callback": function (error, result, $, datas, i) {
            var arr = $('.blogpost').map(function (index) {
                var str = $(this).attr('href');
                var object = {
                    numb: str,
                    name: datas[i].name
                };
                return obj;
            }).get().join(',');
            done(arr);
} }]) }; };

crauler (function (arr) {
console.log(arr);
});

最佳答案

您不能将datasi传递给这样的回调函数。调用回调函数的参数取决于调用者,而您无法控制它。

您会看到“ TypeError:无法读取未定义的'undefined'属性”,因为您希望回调函数将datasi作为参数;因此,请参见。但是调用方仅使用前三个参数[crawler callback reference]来调用回调,因此datasiundefined

因此,您应该从以下行中删除datasi

"callback": function (error, result, $, datas, i) {


因为datas是在回调函数的外部范围中定义的,所以回调可以访问datas而无需任何特殊处理。对于变量i,如其他答案中所述,这有点棘手,因此您需要为其创建一个闭包。

因此,您的回调函数定义应类似于以下内容:

"callback": (function(i) { // create closure for i
    return function (error, result, $) { // no more datas and i here
        var arr = $('.blogpost').map(function (index) {
            var str = $(this).attr('href');
            var object = {
                numb: str,
                name: datas[i].name // access datas as it
            };
            return obj;
        }).get().join(',');
        done(arr);
    }
})(i)

关于javascript - 函数仅看到三个参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17262423/

10-12 12:39
查看更多