【问题标题】:Async calling out generated functions in series异步调用串行生成的函数
【发布时间】:2012-04-22 21:59:30
【问题描述】:

我在串行调用生成的函数时遇到问题。我正在使用异步库,当不需要深度回调调用时,代码似乎可以工作。当我添加真实场景时,它会引发错误。

这是一个有效的例子,返回 0 到 4 的数组:

Scrape.prototype.generatePageFunctions = function() {
  var functionList = new Array(), self = this;

  for (var i = 0; i < this.pageSet; i++) {
    (function(i) {
      functionList.push(function(cb) {
        // Inner functions which will be called in seriers
        var timeoutTime = parseInt(Math.random() * 5000 + 3000, 10);

        setTimeout(function() {
          self.setIndex(i);
          //self.getSite(function)

          cb(null, i);
        }, timeoutTime);
      });
    })(i);
  }
  return functionList;
}

Scrape.prototype.run = function() {
  var functionList = this.generatePageFunctions();

  async.series(functionList, function(err, results) {
    console.log('Job is completed ');
    console.log(results);
  });
}

现在添加真实场景,例如下载站点然后放入回调:

Scrape.prototype.generatePageFunctions = function() {
  var functionList = new Array(), self = this;

  for (var i = 0; i < this.pageSet; i++) {
    (function(i) {
      functionList.push(function(cb) {
        // Inner functions which will be called in seriers
        var timeoutTime = parseInt(Math.random() * 5000 + 3000, 10);

        setTimeout(function() {
          self.setIndex(i);
          self.getSite(function(result) {
            // Async callback to pass the data
            cb(null, result);
          });
        }, timeoutTime);
      });
    })(i);
  }
  return functionList;
}

错误是这样的,即使传递而不是结果迭代器变量i:

/home/risto/scrape/node_modules/async/lib/async.js:185
            iterator(x.value, function (err, v) {
                      ^
TypeError: Cannot read property 'value' of undefined
    at /home/risto/scrape/node_modules/async/lib/async.js:185:23
    at /home/risto/scrape/node_modules/async/lib/async.js:108:13
    at /home/risto/scrape/node_modules/async/lib/async.js:119:25
    at /home/risto/scrape/node_modules/async/lib/async.js:187:17
    at /home/risto/scrape/node_modules/async/lib/async.js:491:34
    at /home/risto/scrape/scraper/scrape.js:114:13
    at /home/risto/scrape/scraper/scrape.js:64:16
    at Object.<anonymous> (/home/risto/scrape/scraper/engines/google.js:58:12)
    at Function.each (/home/risto/scrape/node_modules/cheerio/lib/api/utils.js:133:19)
    at [object Object].each (/home/risto/scrape/node_modules/cheerio/lib/api/traversing.js:69:12)

// 编辑

只有添加到完整回调中的结果是第一个,其他函数永远不会被调用。 此外,如果这很重要,函数会返回对象文字。

【问题讨论】:

  • 您应该接受更有帮助的答案。
  • 真的忘记了这个功能:),已修复

标签: javascript node.js asynchronous


【解决方案1】:

您的代码没有任何问题。创建一个简单的测试用例表明了这一点。

我创建了一个模拟:

Scrape = function() {
  this.pageSet = 5;
}

Scrape.prototype.setIndex = function() {
}

Scrape.prototype.getSite = function(cb) {
  cb('works');
}

并调用run 方法,它会输出预期的结果:

[ 'works', 'works', 'works', 'works', 'works' ]

所以问题出在其他地方。您是否尝试过检查 run 方法中的 functionList 变量?

【讨论】:

  • 那么数组包含函数 [ [Function], [Function], [Function], [Function], [Function] ],我找到了类似的主题,但我无法真正理解导致错误。 stackoverflow.com/questions/8023591/…
【解决方案2】:

谢谢@KARASZI István,上面的所有代码都是正确的,问题似乎出在其他地方。最深的回调被多次调用,但最外层的回调只被调用一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 2012-02-28
    • 2015-11-29
    • 2019-08-17
    • 2018-02-22
    • 2012-07-25
    • 2021-09-27
    • 2020-11-20
    相关资源
    最近更新 更多