Javascript 如何从node.js中的请求方法中填充的数组中访问数据?
我是Node.js的新手,我正在尝试通过一个包含3个URL的数组来获取一些数据。刮取的数据将用于存储在mongodb集合中 现在,我正在遍历url数组,在for循环中为每个url使用节点的请求模块,并将数据动态存储在名为products的数组中 我的问题是,当我尝试在request方法之外的控制台上打印products.length时,该值为0,表示一个空数组。以下是我代码的一部分:Javascript 如何从node.js中的请求方法中填充的数组中访问数据?,javascript,node.js,Javascript,Node.js,我是Node.js的新手,我正在尝试通过一个包含3个URL的数组来获取一些数据。刮取的数据将用于存储在mongodb集合中 现在,我正在遍历url数组,在for循环中为每个url使用节点的请求模块,并将数据动态存储在名为products的数组中 我的问题是,当我尝试在request方法之外的控制台上打印products.length时,该值为0,表示一个空数组。以下是我代码的一部分: //these arrays will store the scraped information from w
//these arrays will store the scraped information from webpage
var prodList = [];
var priceList = [];
//this is the array that will be used to organize and display the scraped info
var products = [];
//store scraped data as an object
function Prod(prodName, price) {
this.prodName = prodName;
this.price = price;
};
var populateArray = function() {
//urls to scrape
var nyxLinks = [
"http://www.nyxcosmetics.ca/en_CA/face?sz=999&viewall=1",
"http://www.nyxcosmetics.ca/en_CA/lips?sz=999&viewall=1",
"http://www.nyxcosmetics.ca/en_CA/eyes?sz=999&viewall=1"
];
//empty all arrays
prodList = [];
priceList = [];
products = [];
for(var i = 0; i < nyxLinks.length; i++) {
//define url to download
var url = nyxLinks[i];
console.log(url);
request(url, function(error, response, body) {
if(!error) {
//load page into cheerio
var $ = cheerio.load(body);
//for each product on the page store in respective arrays
$(".product_tile_wrapper").each(function(i, elem) {
prodList.push($(this).find($(".product_name")).attr("title"));
priceList.push($(this).find($(".product_price")).attr("data-pricevalue"));
});
for(var i = 0; i < prodList.length; i++) {
//store product info as an object
products.push(new Prod(prodList[i], priceList[i]));
}
} else {
console.log("We've encountered an error!")
}
}).on("end", function(err, data) {
if(!err) {
console.log("products length " + products.length);
} else {
console.log(err);
}
});
}
console.log("products length " + products.length);
}
mongoose.connect('mongodb://127.0.0.1:27017/makeupdb');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'Connection Error:'));
db.once('open', function() {
// we're connected
populateArray();
console.log("number of products in products array " + products.length);
//clear the current collection - db.remove({})
//insert data in mongodb - db.insert(products)
});
我相信我需要使用回调才能访问products阵列,但我不确定在哪里需要使用此回调。任何帮助都将不胜感激
谢谢
Radha这是因为JavaScript的异步模型。引擎不会等待执行
.on('end')
回调,然后继续执行for
循环的下一次迭代
您可以有一个计数器变量,该变量在每次调用回调时递增,当计数器达到请求数时,调用最终函数。这样做:
var numRequestsFinished = 0;
var products = [];
var finalCallback = function() {
console.log('Final Products:', products);
};
for (var i = 0; i < nyxLinks.length; i++) {
request(..., function(err, data) {
numRequestsFinished++;
// error checking
products.push(data);
if (numRequestsFinished === nyxLinks.length) {
finalCallback();
}
});
}
var numrequestsffinished=0;
var乘积=[];
var finalCallback=函数(){
console.log('最终产品:',产品);
};
对于(var i=0;i
或者,您可以查看Promise库,例如和
Promise.all
API。这将允许您定义一个函数,当数组中的所有承诺都完成时调用。这是因为JavaScript的异步模型。引擎不会等待执行.on('end')
回调,然后继续执行for
循环的下一次迭代
您可以有一个计数器变量,该变量在每次调用回调时递增,当计数器达到请求数时,调用最终函数。这样做:
var numRequestsFinished = 0;
var products = [];
var finalCallback = function() {
console.log('Final Products:', products);
};
for (var i = 0; i < nyxLinks.length; i++) {
request(..., function(err, data) {
numRequestsFinished++;
// error checking
products.push(data);
if (numRequestsFinished === nyxLinks.length) {
finalCallback();
}
});
}
var numrequestsffinished=0;
var乘积=[];
var finalCallback=函数(){
console.log('最终产品:',产品);
};
对于(var i=0;i
或者,您可以查看Promise库,例如和Promise.all
API。这将允许您定义一个函数,当数组中的所有承诺都完成时调用该函数