从匿名函数的 while 循环中中断
break from while loop from anonymous function
我是 javascript 的新手,我的背景是 python 和 ruby,我在处理 javascript 匿名函数时遇到问题,我的问题如下:
我在页面中有一个具有属性值 (true/false) 的元素,我需要继续执行操作,直到该属性更改值。
我试过的代码如下,正如您猜到的那样,如果 result.value == true
,break
将不会退出循环...知道我的方向是否正确吗?
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);
};
我是 javascript 的新手,我的背景是 python 和 ruby,我在处理 javascript 匿名函数时遇到问题,我的问题如下:
我在页面中有一个具有属性值 (true/false) 的元素,我需要继续执行操作,直到该属性更改值。
我试过的代码如下,正如您猜到的那样,如果 result.value == true
,break
将不会退出循环...知道我的方向是否正确吗?
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);
};