使用async与多个函数javascript

时间:2013-10-22 05:27:16

标签: javascript arrays node.js async.js

如何使用多个相关函数正确使用异步...

这是我的尝试无法解决,它位于async.waterfall函数中:

function (urlsCreated, cb) {
        var z, artist, title, added_on;
        z = [];
        async.mapSeries(urlsCreated, function (url, next) {
            scrape_music.total_pages(50, url, function (array, total, extra) {
                    scrape_music.each(artist, title, added_on, array, url, function (result) {
                    });
            });        
        }, function (z) {

            console.log(z);
        });
    }

这一部分的一切都很好......

基本上urlsCreated是一个包含2个URL的数组......

然后我调用了mapSeries,假设它将在它们之间迭代......

它应该工作的方式是,它遍历数组中的每个url,然后对于每个url,它应该获得url的总页数,然后为每个页面计数添加到数组参数/回调total_pages中的内容应该在......内重复。

基本上这些数组是:urlsCreated(包含2个链接) - >数组(包含total_pages方法中的总页数) - >结果(.each方法应该抓住每个页面,预先包含在数组中的页数),然后重复urlsCreated中的url数量...

任何帮助都会很精彩,目前没有为z打印任何内容,基本上我只想要一个数组,其中包含scrape_music.each结果中返回的对象。

修改 ----

以下是这些功能的代码。

//loop thrugh each page and find jquery elements that match
    Scrape.prototype.each = function (artist, title, added_on, array, urls, cb) {
        console.log('entered each');
        console.log(array);
        var $trs, list;
        list = [];
        this.page(array, urls, function ($page) {
            //$trs selects all the rows from 1-50
            $trs = $page('tr').slice(11, -3);
            $trs.map(function (i, item) {  
                var result;
                result = {};
                result.artist = $page(item).find('td').eq(1).text();
                result.title = $page(item).find('td').eq(2).text();
                result.added_on = $page(item).find('td').eq(3).text();
                list.push(result);

            }); 

                cb(list);
        });

    };

    Scrape.prototype.total_pages = function (divide, url, cb) {
        return request("" + url + config.url.pageQ + 0, function (err, res, body) {
                if (err) { throw err; }
                var page, select, match, total, matches, array, extra;
                array = [];
                page = cheerio.load(body);
                select = page('tr').slice(9, 10);
                match = page(select).find('td').eq(1).text();
                matches = match.slice(-18, -14).trim();
                total = Math.round(matches / divide);
                extra = matches % divide;
                for(x = 0; x < total; x++) {
                    array.push(x);
                }
                cb(array, total, extra);         
         });
    };

     //used to loop through all pages
    Scrape.prototype.page = function (array, urls, cb) {
        return array.forEach(function (i) {
            return request("" + urls + config.url.pageQ + i, function (err, res, body) {
                //console.log(urls + config.url.pageQ + i);
                if (err) { throw err; }
                cb(cheerio.load(body));
            });
        });
    };

1 个答案:

答案 0 :(得分:1)

function (urlsCreated, cb) {
    var artist, title, added_on;

    async.mapSeries(urlsCreated, function (url, next) {
        scrape_music.total_pages(50, url, function (array, total, extra) {
            // 1:
            scrape_music.each(artist, title, added_on, array, url, function (result) {
                // 2:
                next(null, result);
            });
        });        
    }, function (err, z) {
        // 3:
        console.log(z);
    });
}
  1. each()这里不能是迭代器(不确定它是什么),因为每次迭代只能为asyncMap调用next()。如果在迭代完成时调用回调,那么它很好
  2. 告诉异步此迭代已完成。第一个参数是任何错误
  3. 第二个参数是新数组