我是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块吗?如果我错了,请纠正我。
答案 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);
};