Javascript CasperJS在for循环中继续
Javascript CasperJS在for循环中继续,javascript,asynchronous,casperjs,continue,Javascript,Asynchronous,Casperjs,Continue,如何组合实现“continue”命令 casper.then(function() { var current = 1; var end = 4; var something = true; for (;current < end;) { (function(cntr) { casper.thenOpen('about:blank', function() { this.echo('loop num
如何组合实现“continue”命令
casper.then(function() {
var current = 1;
var end = 4;
var something = true;
for (;current < end;) {
(function(cntr) {
casper.thenOpen('about:blank', function() {
this.echo('loop number: '+ cntr);
});
casper.then(function(){
if (something) {
continue; // ERROR: 'continue' is only valid inside a loop statement
}
});
casper.then(function(){
this.echo('this still gets printed');
});
})(current);
current++;
}
});
casper.then(函数(){
无功电流=1;
var-end=4;
var某物=真;
对于(;电流<结束;){
(功能(cntr){
casper.thenOpen('about:blank',function()){
this.echo('循环编号:'+cntr);
});
casper.then(函数(){
如果(某物){
continue;//错误:“continue”仅在循环语句中有效
}
});
casper.then(函数(){
this.echo('这仍然会被打印');
});
})(当前);
电流++;
}
});
我得到一个“仅在循环内有效”错误,但是。。。它在循环内?它不在循环内。使用匿名函数隔离作用域时,将丢失“循环作用域”引用,因此continue不知道循环在哪里。虽然可以使用闭包(函数范围之外的变量),但不能引用外部循环 请参见控制台中的:
for (var i=0;i<10;i++) continue;
for(var i=0;i一旦进入内部函数(实际上有两个级别,循环体周围的生命和传递给然后打开的函数),就不再在循环的范围内
此外,传递给casper.然后
和casper.然后打开
的函数以异步方式(但按顺序)执行。如果要影响顺序,必须检查这些函数中的值
casper.then(function() {
var current = 1;
var end = 4;
var something = true;
var shouldContinue = false;
for (;current < end;) {
(function(cntr) {
casper.thenOpen('about:blank', function() {
shouldContinue = false;
this.echo('loop number: '+ cntr);
});
})(current, s);
(function(cntr) {
casper.then(function(){
if (something) {
shouldContinue = true;
}
});
})(current);
(function(cntr) {
if (shouldContinue) {
return;
}
casper.then(function(){
this.echo('this still gets printed');
});
})(current);
current++;
}
});
casper.then(函数(){
无功电流=1;
var-end=4;
var某物=真;
var shouldContinue=false;
对于(;电流<结束;){
(功能(cntr){
casper.thenOpen('about:blank',function()){
shouldContinue=false;
this.echo('循环编号:'+cntr);
});
})(当前,s);
(功能(cntr){
casper.then(函数(){
如果(某物){
shouldContinue=true;
}
});
})(当前);
(功能(cntr){
如果(应该继续){
返回;
}
casper.then(函数(){
this.echo('这仍然会被打印');
});
})(当前);
电流++;
}
});
此解决方案有效,但我对此不太满意。在每个casper.then节中添加了一个if/else和一个全局skip变量。一旦满足continue条件,将有效跳过所有后续casper.then。skip将在每个循环开始时重置
casper.start();
casper.then(function() {
var current = 1;
var end = 4;
var skip;
for (;current < end;) {
(function(cntr) {
casper.thenOpen('about:blank', function() {
this.echo('loop number: '+ cntr);
skip = false;
});
casper.then(function(){
if (skip) {
this.echo('skipping');
}
else {
// put all code here that was in casper.then
this.echo('proceed as normal');
skip = true;
}
});
casper.then(function(){
if (skip) {
this.echo('skipping');
}
else {
// put all code here that was in casper.then
this.echo('this no longer gets printed');
}
});
})(current);
current++;
}
});
casper.start();
casper.then(函数(){
无功电流=1;
var-end=4;
var跳跃;
对于(;电流<结束;){
(功能(cntr){
casper.thenOpen('about:blank',function()){
this.echo('循环编号:'+cntr);
跳过=错误;
});
casper.then(函数(){
如果(跳过){
这个.echo('skipping');
}
否则{
//把casper里的所有代码都放在这里
此.echo(“按正常方式进行”);
跳过=真;
}
});
casper.then(函数(){
如果(跳过){
这个.echo('skipping');
}
否则{
//把casper里的所有代码都放在这里
this.echo('这不再被打印');
}
});
})(当前);
电流++;
}
});
所有casper.then*
和casper.wait*
函数都是异步的。传递给它们的步骤函数实际上是在循环完成后执行的。因此,不能使用continue
跳转到下一个迭代
但是,您可以嵌套所有step函数,从而实现您所期望的:
casper.then(function() {
var current = 1;
var end = 4;
var something = true;
while(current < end) {
(function(cntr) {
casper.thenOpen('about:blank', function() {
this.echo('loop number: '+ cntr);
});
casper.then(function(){
if (something) {
return; // this replaced `continue`
}
// more synchronous code
this.then(function(){
this.echo('this still gets printed');
});
});
})(current);
current++;
}
});
casper.then(函数(){
无功电流=1;
var-end=4;
var某物=真;
while(当前<结束){
(功能(cntr){
casper.thenOpen('about:blank',function()){
this.echo('循环编号:'+cntr);
});
casper.then(函数(){
如果(某物){
return;//替换为“continue”`
}
//更同步的代码
this.then(function(){
this.echo('这仍然会被打印');
});
});
})(当前);
电流++;
}
});
它以一个额外的缩进级别为代价稍微短了一点。除了OP不能从casper返回外。然后打开?我想根据casper.then函数中的一个可变条件而不是循环数继续。这将如何在capser中实现。那么?这会引发相同的错误。CasperJS是一个奇怪的beast.@ProGirlXOXO抱歉,我对我的答案不是很仔细,已经修复了。顺便说一句,我会在程序员的堆栈交换上发布这篇文章,并寻求改进建议,这段代码看起来很粗糙。没有按预期工作。输出:循环编号:1这仍然得到打印循环编号:2这仍然得到打印循环编号:3这仍然得到printed已完成。您已经在记录内容:this.echo('loop number:'+cntr)所以我必须为每个潜在的返回点缩进一个额外的级别。作为Python的粉丝,我不喜欢这种方法。我知道,这并不漂亮,但这是异步代码的本质,你不能期望同步代码与异步代码同时运行。casper至少确保异步代码按顺序运行,这意味着l代码必须在传递给然后
的函数中,因此该代码不能使用外部函数中的告诉循环来继续
casper.start();
casper.then(function() {
var current = 1;
var end = 4;
var skip;
for (;current < end;) {
(function(cntr) {
casper.thenOpen('about:blank', function() {
this.echo('loop number: '+ cntr);
skip = false;
});
casper.then(function(){
if (skip) {
this.echo('skipping');
}
else {
// put all code here that was in casper.then
this.echo('proceed as normal');
skip = true;
}
});
casper.then(function(){
if (skip) {
this.echo('skipping');
}
else {
// put all code here that was in casper.then
this.echo('this no longer gets printed');
}
});
})(current);
current++;
}
});
casper.then(function() {
var current = 1;
var end = 4;
var something = true;
while(current < end) {
(function(cntr) {
casper.thenOpen('about:blank', function() {
this.echo('loop number: '+ cntr);
});
casper.then(function(){
if (something) {
return; // this replaced `continue`
}
// more synchronous code
this.then(function(){
this.echo('this still gets printed');
});
});
})(current);
current++;
}
});