Javascript 从匿名函数中断while循环

Javascript 从匿名函数中断while循环,javascript,nightwatch.js,Javascript,Nightwatch.js,我是javascript新手,我的背景是python和ruby,我在处理javascript匿名函数时遇到问题,我的问题如下: 我在页面中有一个元素,它有一个属性值(true/false),我需要继续执行一个操作,直到这个属性改变值 我尝试的代码如下所示,您可以猜到,如果result.value==true,则中断不会退出循环。。。知道我的方向对不对吗 var counter = 0; while (counter < 5) { this .click('#someelemen

我是javascript新手,我的背景是python和ruby,我在处理javascript匿名函数时遇到问题,我的问题如下:

我在页面中有一个元素,它有一个属性值(true/false),我需要继续执行一个操作,直到这个属性改变值

我尝试的代码如下所示,您可以猜到,如果
result.value==true
,则
中断
不会退出循环。。。知道我的方向对不对吗

var counter = 0;
while (counter < 5) {
  this
    .click('#someelementid')
  counter++;
  this
    .getAttribute('#someelementid', 'disabled', function(result) {
      if (result.value == 'true') {
        this.break;
      }
    }.bind(this));
  this.api.pause(1000);
};
var计数器=0;
while(计数器<5){
这
。单击(“#someelementid”)
计数器++;
这
.getAttribute('#someelementid',disabled',函数(结果){
如果(result.value='true'){
这是休息;
}
}.约束(这个);
本.api.pause(1000);
};

我的假设是,通过绑定它,我可以访问while块?如果我错了,请纠正我。

您是否尝试过将代码更改为以下内容

var counter = 0;
var arr = [1, 2, 3, 4, 5];
while (counter < 5) {
  arr.forEach(
    (element) => {
      if (counter < 5) { // if you don't have this it will print all 5, else it prints only 3
        console.log('Element value:', element);
      }
      if (element == 3) {
        counter = 5;
      }
    }
  );
}

您是否尝试过将代码更改为以下内容

var counter = 0;
var arr = [1, 2, 3, 4, 5];
while (counter < 5) {
  arr.forEach(
    (element) => {
      if (counter < 5) { // if you don't have this it will print all 5, else it prints only 3
        console.log('Element value:', element);
      }
      if (element == 3) {
        counter = 5;
      }
    }
  );
}

函数内部的中断不会中断函数外部的循环

通过getAttribute()内联获取结果,而不是回调。然后你可以破坏这个函数

有一个全局变量<代码>中断循环=错误将其设置为true;在回调函数内部。在while循环中检查这个变量<代码>while(!breakLoop..)

另一种方法

完全没有循环

var counter = 0;

function doSomething(){
    this.click('#someelementid');
    counter++;

    this.getAttribute('#someelementid', 'disabled', function(result) {
        if(result.value != 'true' && counter<5){
            this.api.pause(1000);
            doSomething();
        }
    }.bind(this);

};
var计数器=0;
函数doSomething(){
单击(“#someelementid”);
计数器++;
this.getAttribute('#someelementid',disabled',函数(结果){

if(result.value!=“true”&&counter函数内部的中断不会中断函数外部的循环

通过getAttribute()以内联方式获取结果,而不是回调。然后可以中断该函数

在回调函数中有一个全局变量。
breakLoop=false;
将其设置为true;。并在while循环中检查此变量。
while(!breakLoop..)

另一种方法

完全没有循环

var counter = 0;

function doSomething(){
    this.click('#someelementid');
    counter++;

    this.getAttribute('#someelementid', 'disabled', function(result) {
        if(result.value != 'true' && counter<5){
            this.api.pause(1000);
            doSomething();
        }
    }.bind(this);

};
var计数器=0;
函数doSomething(){
单击(“#someelementid”);
计数器++;
this.getAttribute('#someelementid',disabled',函数(结果){

如果(result.value!='true'&&counter我有,尽管即使将计数器设置为5,它似乎也没有中断…不确定为什么..我用适合我的解决方案编辑了答案,请尝试实现它。酷,我已经成功地使它工作了,非常感谢您的帮助!我有,尽管即使将计数器设置为5,它似乎也没有中断。…不知道为什么..我已经用对我有效的解决方案编辑了答案,请尝试实现它。很好,我已经设法让它工作了,非常感谢你的帮助!能否给出一个示例,说明如何内联获得结果,而不是回调?我正在尝试自己解决问题,但如果你能将我发送到ri,我会很有帮助ght方向我认为您正在使用的nightwatch框架不支持这样的内联api。您可以尝试第二个选项,使用全局变量来中断循环。是否可以给出一个示例,说明如何内联获取结果,而不是回调?我正在尝试自己弄清楚,但如果您可以将我发送到正确的方向我认为你正在使用的nightwatch框架不支持这样的内联api。你可以尝试第二个选项,使用全局变量来打破循环。