关于async这个库的mapLimit方法卡死的问题

发布于 2022-09-11 14:54:48 字数 2826 浏览 15 评论 0

代码如下:

var cheerio     = require('cheerio');
var superagent1 = require('superagent');
var eventproxy  = require('eventproxy');
var async       = require('async');
var utils       = require('./utils');
var install     = require('superagent-charset');
var fs             = require('fs');
var superagent  = install(superagent1);
var current_book = {};
var error_list = [];
var n=1;
superagent.get('http://www.biquku.com/0/330/').charset('gbk')
    .end(function (err, sres) {
      // 常规的错误处理
      if (err) {
        console.log(err);
      }
      // sres.text 里面存储着网页的 html 内容,将它传给 cheerio.load 之后
      // 就可以得到一个实现了 jquery 接口的变量,我们习惯性地将它命名为 `$`
      // 剩下就都是 jquery 的内容了
      var $ = cheerio.load(sres.text);
      var urls = $('#list a');  

      current_book.title = $('#maininfo h1').text()
      current_book.author = $('#info p').eq(0).text()
      current_book.update_time = $('#info p').eq(2).text()
      current_book.latest_chapter = $('#info p').eq(3).html()
      current_book.intro = $('#intro').html()
      current_book.chapters = [];

      for(var i = 0; i< urls.length; i++){
        var url = urls[i]
        var _url = $(url).attr('href')+"";
        var num = _url.replace('.html','');
        var title = $(url).text();
        current_book.chapters.push({
          num: num,
          title: title,
          url: _url
        })
      }
      console.log(current_book.chapters.length);

      async.mapLimit(current_book.chapters, 200, function (url, callback) {
          fetchUrl(url, callback);
        }, function (err, result) {
          console.log('final:');
          console.log(error_list);
        });
    });

function fetchUrl(url, callback){
    console.log(n++);
    if(n==1637){
        console.log(error_list)
    }
    superagent.get('http://www.biquku.com/0/330/' + url.num + '.html').charset('gbk').end(function(err,res){
        var timer = setTimeout(function(){
            callback(null);
        },500);
        if(!err){
            clearTimeout(timer)
            if(res){    
            if(res.text){
                var $ = cheerio.load(res.text);
                var content = $('#content').html();
                fs.writeFile('dist/0/330/' + url.num + '.html', content, function (err) {
                    if (err) throw err;
                    callback(null);
                  });

                }
            }else{
                error_list.push(url);
                callback(null);
            }
        }else{
            clearTimeout(timer)
            callback(null);
        }
        
    })
}

async.mapLimit最后的回调,不执行程序处于假死状态;在命令行显示如下:

clipboard.png

求大神们给分析一下为什么会这样子;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

幸福还没到 2022-09-18 14:54:48

我也遇到这个问题,请问你解决了吗?

时间你老了 2022-09-18 14:54:48

我也用到了maplimit,不过我不是这么用的,
我的每个request会回来html,然后cheerio怼成数组,直接就callback了,
然后用maplimti把这个request包起来,得到一个大数组,怼mySql了

看代码楼主是想扒章节录接着扒内容(类似),个人建议先扒章节,所有章节完成之后再获取内容

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文