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:无法读取未定义的属性“未定义”
因为
因此,您的回调函数定义应类似于以下内容:
(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);
});
最佳答案
您不能将datas
和i
传递给这样的回调函数。调用回调函数的参数取决于调用者,而您无法控制它。
您会看到“ TypeError:无法读取未定义的'undefined'属性”,因为您希望回调函数将datas
和i
作为参数;因此,请参见。但是调用方仅使用前三个参数[crawler callback reference]来调用回调,因此datas
和i
是undefined
。
因此,您应该从以下行中删除datas
和i
:
"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/