Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从node.js中的请求方法中填充的数组中访问数据?_Javascript_Node.js - Fatal编程技术网

Javascript 如何从node.js中的请求方法中填充的数组中访问数据?

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

我是Node.js的新手,我正在尝试通过一个包含3个URL的数组来获取一些数据。刮取的数据将用于存储在mongodb集合中

现在,我正在遍历url数组,在for循环中为每个url使用节点的请求模块,并将数据动态存储在名为products的数组中

我的问题是,当我尝试在request方法之外的控制台上打印products.length时,该值为0,表示一个空数组。以下是我代码的一部分:

//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。这将允许您定义一个函数,当数组中的所有承诺都完成时调用该函数