从匿名函数中断while循环

时间:2017-09-15 10:53:25

标签: javascript nightwatch.js

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

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

我尝试过的代码如下所示,正如您可能猜到的那样,break如果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);
};

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

通过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);

};