从匿名函数的 while 循环中中断

break from while loop from anonymous function

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

我在页面中有一个具有属性值 (true/false) 的元素,我需要继续执行操作,直到该属性更改值。

我试过的代码如下,正如您猜到的那样,如果 result.value == truebreak 将不会退出循环...知道我的方向是否正确吗?

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

我的假设是通过绑定它,我可以访问 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;
      }
    }
  );
}

这是怎么回事:

当你进入while循环时它会进入forEach循环并开始迭代,当它到达element == 3时它会将counter设置为5,但它仍然必须完成当前的 forEach 循环,一旦它完成它就不会执行另一个 while 循环因此退出它。

因此将您的代码更改为:

var counter = 0;
while (counter < 5) {
  this
    .click('#someelementid')
  counter++;
  this
    .getAttribute('#someelementid', 'disabled', function(result) {
      if (result.value == 'true') {
        counter = 5; // This should do the trick (without 'this')
      }
    }.bind(this));
  this.api.pause(1000);
};

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

通过 getAttribute() 获取内联结果而不是回调。然后你可以打破这个功能。

或者

有一个全局变量。 breakLoop = false; 将其设置为真;在回调函数里面。并在 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);

};