1

生成された関数をシリアルで呼び出すのに問題があります。私は非同期ライブラリを使用していますが、深いコールバック呼び出しが必要ない場合、コードは機能しているようです。実際のシナリオを追加すると、エラーがスローされます。

動作する例を次に示します。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)

// 編集

完全なコールバックに追加される結果のみが最初のものであり、他の関数は呼び出されません。また、情報が必要な場合、関数はオブジェクト リテラルを返します。

4

2 に答える 2

2

コードに問題はありません。簡単なテストケースを作成すると、それが示されます。

モックを作成しました:

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

Scrape.prototype.setIndex = function() {
}

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

メソッドを呼び出すとrun、期待されるものが出力されます。

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

したがって、問題は別の場所にあります。functionListメソッド内の変数をチェックしようとしましたrunか?

于 2012-04-22T08:27:28.360 に答える
0

@KARASZI Istvánに感謝します。上記のコードはすべて正しく、問題は別の場所にあるようです。最も深いコールバックは複数回呼び出されましたが、外側のコールバックは 1 回しか呼び出されませんでした。

于 2012-04-22T13:59:30.577 に答える