节点:如何确保函数仅在创建对象后运行?

时间:2013-06-07 03:24:11

标签: javascript node.js

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

问题是,我的对象正在创建,但在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抓取的内容,但缺少某些位。 genderdate属性始终存在,属性存在,但它们只是空白(例如product.name返回""而不是未定义。)

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

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

1 个答案:

答案 0 :(得分:1)

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

  1. cheerio.load在调用createProduct之前尚未完成。
  2. createProduct product在调用callback之前未填充或部分描述(不确定)。
  3. 您可以使用async库来同步执行函数(使用async.series)。如果createProduct也是异步的,则必须以类似的方式使其同步。

    async.series([
        function(callback){
            $ = cheerio.load(body);
            callback();
        },
        function(callback){
            createProduct(obj, function(product){
                lookUp(product);
            });
            callback();
        }
    ]);
    
相关问题