0

如何正确使用 async 与多个依赖函数...

这是我的尝试,但没有成功,它在 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));
            });
        });
    };
4

1 回答 1

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. 告诉 async 这个迭代完成了。第一个参数是任何错误
  3. 第二个参数是新数组
于 2013-10-22T06:53:33.623 回答