0

我正在使用nodejswithcheerio从网站上抓取数据,并从中创建一个对象。然后,它需要获取该对象并在函数中使用它。

问题是,我的对象正在创建,但在cheerio可以正确解析数据并将其放入对象之前,下一个函数已经在运行。这是我的代码:

function getInfo(obj, link){
    request(link, function(err, resp, body) {
        if (err) {
            console.log("Uh-oh: " + err);
            throw err;
        }
        $ = cheerio.load(body);
        function createProduct(obj, callback){
            var product = {
                    name        : $('#name').text(),
                    gender      : obj.gender,
                    infoLink    : link,
                    designer    : $('.label').first().text(),
                    price       : $('#price').first().text(),
                    description : $('.description').text(),
                    date        : new Date()
            }
           product.systemName = (function(){
            return product.name.replace(/\s+/g, ' ');
           }());

            callback(product);
        }
        createProduct(obj, function(product){
            lookUp(product);
        });

我在这里得到了好坏参半的结果。在正确输入所有详细信息的情况下,一些product对象被发送到函数中。有些缺少描述,有些缺少每个cheerio填充的内容。其他人有一些cheerio抓取的内容,但缺少某些位。gender和属性总是存在的date,并且属性存在,但它们只是空白(例如product.name返回""而不是未定义)。

我检查了每个违规链接,所有页面都包含要抓取的正确选择器。

product填充对象后,如何将回调设置为 ONLY 函数?

4

1 回答 1

1

有两种可能的异步执行可以获得这些结果:

  1. cheerio.loadcreateProduct在调用之前还没有完成。
  2. IncreateProduct product没有被填充或部分类似于之前callback的描述(不确定)。

您可以使用异步库使函数同步执行(通过使用async.series)。如果createProduct也是异步的,则必须以类似的方式使其同步。

async.series([
    function(callback){
        $ = cheerio.load(body);
        callback();
    },
    function(callback){
        createProduct(obj, function(product){
            lookUp(product);
        });
        callback();
    }
]);
于 2013-06-07T05:08:29.030 回答