Javascript 函数只能看到三个参数
这是一个在Node.js上运行的简化代码,它获取所有数据。 但是,当我添加name:datas[I]时,如何在变量“I”的函数值中插入(变量I=0…的)。name返回一个错误: TypeError:无法读取undefined的属性“undefined”Javascript 函数只能看到三个参数,javascript,node.js,Javascript,Node.js,这是一个在Node.js上运行的简化代码,它获取所有数据。 但是,当我添加name:datas[I]时,如何在变量“I”的函数值中插入(变量I=0…的)。name返回一个错误: TypeError:无法读取undefined的属性“undefined” var Crawler=require(“Crawler”).Crawler; var crawler=新的爬虫程序; 变量数据=[ {name:'John',url:'john025'}, {名称:'Jim',url:'jim04567'} ]
var Crawler=require(“Crawler”).Crawler;
var crawler=新的爬虫程序;
变量数据=[
{name:'John',url:'john025'},
{名称:'Jim',url:'jim04567'}
];
函数crauler(完成){
对于(变量i=0;i
您试图在循环的i
内部创建一个闭包,这会给您带来问题。这个答案应该可以帮助您:
您试图在循环中的
i
周围创建一个闭包,这会给您带来问题。这个答案应该可以帮助您:
您需要一个闭包来捕获值,这是解决问题的一种方法。请继续阅读 Javascript
var Crawler = require("crawler").Crawler;
var crawler = new Crawler;
var datas = [{
name: 'John',
url: 'john025'
}, {
name: 'Jim',
url: 'jim04567'
}];
function queue(link, i) {
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);
}
}]);
}
function crauler(done) {
for (var i = 0; i < datas.length; i++) {
var link = 'http://somesite.com/' + datas[i].url;
queue(link, i);
};
crauler(function (arr) {
console.log(arr);
});
var Crawler=require(“Crawler”).Crawler;
var crawler=新的爬虫程序;
变量数据=[{
姓名:'约翰',
网址:“john025”
}, {
名字:“吉姆”,
url:'jim04567'
}];
功能队列(链接,i){
爬虫队列([{
“uri”:链接,
//在这个函数里面
“回调”:函数(错误、结果、$、数据、i){
var arr=$('.blogpost').map(函数(索引){
var str=$(this.attr('href');
变量对象={
麻木:str,
名称:datas[i].name
};
返回obj;
}).get().join(',');
完成(arr);
}
}]);
}
函数crauler(完成){
对于(变量i=0;i
您需要一个闭包来捕获值,这是解决问题的一种方法。请继续阅读
Javascript
var Crawler = require("crawler").Crawler;
var crawler = new Crawler;
var datas = [{
name: 'John',
url: 'john025'
}, {
name: 'Jim',
url: 'jim04567'
}];
function queue(link, i) {
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);
}
}]);
}
function crauler(done) {
for (var i = 0; i < datas.length; i++) {
var link = 'http://somesite.com/' + datas[i].url;
queue(link, i);
};
crauler(function (arr) {
console.log(arr);
});
var Crawler=require(“Crawler”).Crawler;
var crawler=新的爬虫程序;
变量数据=[{
姓名:'约翰',
网址:“john025”
}, {
名字:“吉姆”,
url:'jim04567'
}];
功能队列(链接,i){
爬虫队列([{
“uri”:链接,
//在这个函数里面
“回调”:函数(错误、结果、$、数据、i){
var arr=$('.blogpost').map(函数(索引){
var str=$(this.attr('href');
变量对象={
麻木:str,
名称:datas[i].name
};
返回obj;
}).get().join(',');
完成(arr);
}
}]);
}
函数crauler(完成){
对于(变量i=0;i
您不能像这样将数据
和i
传递到回调函数中。回调函数将使用什么参数调用取决于调用方,您无法控制它
您将看到“TypeError:无法读取undefined的属性'undefined',因为您希望回调函数将datas
和i
作为参数;但是调用者将仅使用前3个参数调用回调[],因此datas
和i
是未定义的
因此,您应该从以下行中删除数据
和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)
您不能像这样将
data
和i
传递到回调函数中。调用回调函数的参数由调用方决定,您无法控制
您将看到“TypeError:无法读取undefined的属性'undefined',因为您希望回调函数将datas
和i
作为参数;但是调用者将仅使用前3个参数调用回调[],因此datas
和i
是未定义的
因此,您应该从以下行中删除数据
和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)
在for循环外声明
i
。@bfavaretto不是。循环变量不是TypeError的主要问题,请参阅我的答案以了解详细信息。@jaux错误是由于试图解决问题而引起的,因此dupe链接是有意义的。顺便说一句,回答得很好。@bfavaretto谢谢!但这个问题确实不是臭名昭著的循环问题。臭名昭著的lo