Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.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在for循环中继续_Javascript_Asynchronous_Casperjs_Continue - Fatal编程技术网

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