【问题标题】:how to use node.js parse an array by using Promise or Generator如何使用 node.js 通过 Promise 或 Generator 解析数组
【发布时间】:2016-12-25 13:34:09
【问题描述】:
var a = [[1,2,3],[4,5,6],[7,8,9]]
var b = []

a.forEach(function(item) {
  item.forEach(function(it) {
    setTimeout(function () {
      b.push(it)
    }, 1000);
  })
})

console.log(b);

使用 Promise 还是 Generate? 我试过了,但是 b = [], 不是 b = [1,2,3,4,5,6,7,8,9]

var url = 'http://www.imooc.com/learn/348'
function getLinks(url){
  var link_arry = []
  request(url, function (error, response, body) {
    var $ = cheerio.load(body)
    var chapters = $('.chapter')
    var courseName = $('.path').find('span').text()

    chapters.each(function (item) {
      var chapter = $(this)
      var chapterTitle = chapter.find('strong').text()
      
      var videos = chapter.find('li')
      videos.each(function (item) {
        var video = $(this).find('.studyvideo')
        var videoTitle = video.text().trim().replace(/[\r\n]/g, '')
        var id = video.attr('href').split('video/')[1]

        link_arry.push(id)
      })
    })
  })
  return link_arry
}

使用请求获取包含课程、部分章节、部分教派的网页 当我使用 return link_arry 时,总是得到一个空数组 所以...

想要link_arry

【问题讨论】:

  • 为什么b 不能为空?您将所有这些调用延迟 1 秒,因此 console.log(b) 将在任何这些超时有机会实际超时之前执行。
  • 您实际上想要完成什么?如果您只想合并数组,为什么要超时?如果您要演示一些更复杂的需求,那是什么需求?
  • 出于某种原因,我不仅要合并数组,还要更新一些细节

标签: javascript node.js generator es6-promise


【解决方案1】:

我不太懂setTimeout的用法,没关系我给你一个使用Promises的解决方案

var a = [[1,2,3],[4,5,6],[7,8,9]];
var b = [];

var promise = new Promise(function(resolve, reject) {
    var totalLength = Array.prototype.concat.apply([], a).length;

     a.forEach(function(item) {
        item.forEach(function(it) {
           setTimeout(function () {
              b.push(it);
              if(b.length === totalLength) resolve();
            }, 1000);
         })
     });
});

promise.then(function() {
   console.log(b);
});

您也可以使用generator 来完成您的任务:

function getAllValues() {
    var result = [];
    var totalLength = Array.prototype.concat.apply([], a).length;

    a.forEach(function(item) {
        item.forEach(function(it) {
            setTimeout(function () {
                result.push(it);
                if(result.length == totalLength) gen.next(result);
            }, 1000);
        })
    });
}

function *generator() {
    b = yield getAllValues();
    console.log(b);
}

var gen = generator();
//start the generator
gen.next();

【讨论】:

  • 谢谢,我看过一些文档,经常看到他们使用generator和yield来等待函数用完,这里可以这样用吗,我也是用setTimeout
  • @TanLing 我刚刚使用生成器编辑了我的帖子来完成同样的事情
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
相关资源
最近更新 更多