JavaScript/CasperJS在页面上循环时超时的处理

JavaScript/CasperJS在页面上循环时超时的处理,javascript,settimeout,casperjs,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').cr

我对这个脚本有问题。它应该加载一些保存在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);

我使用的文档:

不要在同一个
casper
实例上多次调用
start
run

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(){})

我使用的文档:关于我,是的,我自己犯了一个大错误。。。非常感谢。但是你说的开始和跑步是什么意思?我必须删除哪一个以及如何删除?我提供的代码应该可以工作。同时,我还发现了另一个问题。谢谢,它很有效;)现在我只需要了解一下我以前的代码中的大变化在哪里。我将
start
run
从递归函数移到全局范围,修复了
I++
/
--I
问题,并保持在控制流中。如果您想进一步了解CasperJS的步骤是如何工作的,请看我的回答: