casper评估修改全局变量

时间:2013-04-24 21:58:15

标签: javascript casperjs evaluate

我是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);

所以基本上代码应该从7个页面收集一些数据并将数据存储在全局变量结果中。每个页面都有50个要存储的数据。所以预期的输出是:

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

但实际输出是:

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

我希望每次迭代后结果的长度都会增加。但是当我运行它时,结果的长度保持不变,这意味着在第一次迭代之后,它永远不会被改变。另外,我不明白为什么第1页的长度为0。我无法弄清楚为什么会这样。

1 个答案:

答案 0 :(得分: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]);
}