2013-04-24 83 views
1

我是CasperJS的新手,我遇到了evaluate()函數的問題。我有以下示例代碼:casper評估修改全球變種

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。我無法弄清楚爲什麼。請問有人可以幫忙嗎?謝謝!

回答

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]); 
} 
+0

謝謝!這解決了我遇到的第一個問題。現在結果正在遞增。但是,我仍然有兩個問題:(1)我仍不明白爲什麼page1顯示0結果。在調用check()之後我有了print語句,所以它應該被執行一次。 (2)它看起來像是每個頁面都返回相同的內容,而實際上它應該是不同的。是否評估()調整相同的東西,無論我傳入的網址? – pew007 2013-04-25 05:26:41