Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态CasperJS循环在随机迭代中终止_Javascript_Casperjs - Fatal编程技术网

Javascript 动态CasperJS循环在随机迭代中终止

Javascript 动态CasperJS循环在随机迭代中终止,javascript,casperjs,Javascript,Casperjs,此代码在dynamic.js脚本上展开。dynamic.js的运行方式如下:start,then,run,然后run回调就是动态循环。很好。我的代码不想循环到运行< /COD>回调,它希望在中间循环,这样我就可以在以后运行更多代码。所以它是开始,然后,循环,然后,运行。似乎casper没有在退出之前等待我的循环完成。循环每次运行时都会在不同的点终止,我从来没有看到动态循环之后的“回声。下面是一些示例输出(通常在2到8个循环之间结束),然后是代码: 输出: start main start dyn

此代码在dynamic.js脚本上展开。dynamic.js的运行方式如下:
start
then
run
,然后
run
回调就是动态
循环。很好。我的代码不想循环到<代码>运行< /COD>回调,它希望在中间循环,这样我就可以在以后运行更多代码。所以它是
开始
然后
循环
然后
运行
。似乎
casper
没有在退出之前等待我的
循环完成。循环每次运行时都会在不同的点终止,我从来没有看到动态循环之后的
回声。下面是一些示例输出(通常在2到8个循环之间结束),然后是代码:

输出:

start main
start dynamic loop
0
Something.
1
Something.
2
Something.
3
Something.
4
Something.
5
Something.
代码:

var casper=require('casper').create();
var限值=10;
var i=0;
//动态回路
变量循环=函数(){
如果(i<限制){
这是echo(i);
这个。开始(“http://www.something.com“,函数(){
echo(this.evaluate(函数(){returndocument.body.innerText;}));
});
i++;
这个。运行(循环);
}否则{
echo(“动态循环完成”);
这是exit();
}
}
//主流
卡斯珀,开始http://www.something.com,函数(){
此.echo(“启动主”);
});
casper.then(函数(){
casper.start().then(函数()){
echo(“启动动态循环”);
});
casper.run(循环);
});
casper.then(函数(){
this.echo(“动态循环之后”);
})
casper.run();

您应该在脚本中只使用
casper.start
casper.run
一次。但是,您可以使用它们。如果您将它们嵌套在另一个控制流中,则会遇到“未定义”行为。我发现最好使用
casper.然后打开
casper.然后
替换
casper.start
casper.run

// dynamic loop
var loop = function () {
    if (i < limit) {
        this.echo(i);
        i++;
        this.thenOpen("http://www.something.com", function() {
            this.echo(this.evaluate(function () { return document.body.innerText; }));
        });
        this.then(loop);
    } else {
        this.echo("dynamic loop done");
    }
}

// main flow
casper.start('http://www.something.com', function() {
    this.echo("start main");
});

casper.then(loop);

casper.then(function () {
    this.echo("after dynamic loop");
})

casper.run();
//动态循环
变量循环=函数(){
如果(i<限制){
这是echo(i);
i++;
这个。然后打开(“http://www.something.com“,函数(){
echo(this.evaluate(函数(){returndocument.body.innerText;}));
});
这个。然后(循环);
}否则{
echo(“动态循环完成”);
}
}
//主流
卡斯珀,开始http://www.something.com,函数(){
此.echo(“启动主”);
});
casper.then(loop);
casper.then(函数(){
this.echo(“动态循环之后”);
})
casper.run();
在一个脚本中可能有多个
casper
实例,但是您需要以某种方式同步它们


您的脚本可能需要一些不需要重构的修复。只需删除
this.exit()来自循环。你过早地退出。但我仍然强烈建议您重构脚本。

这是有道理的。我认为这里学到的教训是,如果您想根据页面结果使Casperjs动态化,那么您必须在
run
完成后使用回调。我的示例代码没有显示这一点,但这正是我的目标。乍一看,dynamic.js代码看起来像是嵌套的
start
,但它只是回调。感谢您的帮助。如果
casper.run
完成,则脚本终止。如果您中断了CasperJS控制流,那么您必须在中断的流旁边等待。这通常是不必要的。顺便说一句,什么是dynamic.js?这是您在web上找到的脚本还是您编写的脚本?这是casper附带的示例脚本文件夹中的脚本。谢谢,我完全忘记了这些脚本也存在。虽然这是由CasperJS创建者完成的,但我认为多次使用
start
尤其是
run
是不好的风格。
// dynamic loop
var loop = function () {
    if (i < limit) {
        this.echo(i);
        i++;
        this.thenOpen("http://www.something.com", function() {
            this.echo(this.evaluate(function () { return document.body.innerText; }));
        });
        this.then(loop);
    } else {
        this.echo("dynamic loop done");
    }
}

// main flow
casper.start('http://www.something.com', function() {
    this.echo("start main");
});

casper.then(loop);

casper.then(function () {
    this.echo("after dynamic loop");
})

casper.run();