1

CasperJS は初めてで、evaluate() 関数に問題があります。次のサンプルコードがあります。

var results = [];  // a global var
var links = [link1, link2 ,....];  //a list of urls
var current = 0;

function search(url){
  this.start(url, function(){
    results = this.evaluate(function() { 
      var returnVal = [];
      //some code to store data into returnVal
      return returnVal;
      };
  })
}

function check(){
  if(current<7){
    this.echo('---Page' + (current + 1) + '---');
    search.call(this, links[current]);
    console.log(results.length);
    this.run(check);
    current++;
  } else{
    this.exit();
}

casper.start()
casper.then(function(){this.echo("starting");});
casper.run(check);

SO 基本的に、コードは 7 ページからいくつかのデータを収集し、そのデータをグローバル変数の結果に保存することになっています。各ページには、50 個のデータが保存されます。したがって、期待される出力は次のとおりです。

Starting
---Page1---
50
---Page2---
100
---Page3---
150
...

しかし、実際の出力は次のとおりです。

Starting
---Page1---
0
---Page2---
50
---Page3---
50
...

反復ごとに結果の長さが増加することを期待しています。ただし、実行すると、結果の長さは同じままでした。つまり、最初の反復の後、変更されませんでした。また、ページ 1 で長さが 0 である理由がわかりません。それがなぜなのか、私には理解できませんでした。

4

1 に答える 1

0

これは、テストが実行されるたびに、グローバルな「結果」が再割り当てされているためだと思います。各ステップの後に配列を再割り当てするのではなく、配列に追加する必要があります。何かのようなもの

var tempResults = this.evaluate(function() {
    var returnVal = [];
    // load your data from the page
    return returnVal;
};


for(var i=0, j=tempResults.length; i < j; i++) {
    //append to global here
    results.push(tempResults[i]);
}
于 2013-04-24T23:34:08.297 に答える