循环遍历页面时JavaScript / CasperJS处理超时

时间:2015-11-24 09:50:58

标签: javascript settimeout casperjs

我的脚本有问题。它应该加载一些保存在prova.txt中的链接(逐行),然后将链接逐个传递给CasperJS并获取页面的html。我知道超时/ JavaScript一定存在一些问题。

这是脚本:

var fs = require('fs');
var file_h = fs.open('prova.txt', 'r');
var line = file_h.readLine();
var links = new Array();
var casper = require('casper').create();

while(line) {
    line = file_h.readLine();
    links.push(line);
}

(function theLoop (i) {
    console.log("LOOP");
    casper.start(links[i], function() {
        setTimeout(function () {
            fs.write("stats" + i + ".html", this.getHTML() );
            i = i + 1;
            if (--i) {
                theLoop(i);
            }
        }, 2000);
    });
    casper.run();
})(4);

我使用的文档:http://scottiestech.info/2014/07/01/javascript-fun-looping-with-a-delay/

1 个答案:

答案 0 :(得分:1)

请勿在同一start个实例上多次致电runcasper

casper.start();

(function theLoop (i) {
    console.log("LOOP");
    casper.thenOpen(links[i], function() {
        this.wait(2000, function () {
            fs.write("stats" + i + ".html", this.getHTML() );
            if (--i) {
                theLoop(i);
            }
        });
    });
})(4);

casper.run();

此外,您似乎希望将i减少为0,因此您不应该在下一行中递增(i = i + 1)并递减--i

请记住,如果您在CasperJS脚本中使用setTimeout,那么您将打破步进控制流并且必须以某种方式捕获断开的执行。使用CasperJS'能力直到它变得不可避免。例如,我将setTimeout(function(){}, x)替换为casper.wait(x, function(){})