我正在“ Then”函数中进行一些计算,而我无法将计算的输出移出“ Then”范围。我在下面给出了卡住的示例代码。
var flag= true;
for(let i=1; i<leng, i++){
if(flag){
element(by.xpath("dsds")).click();
--some delete fucntionality
element(by.xpath("abc")).all(tagName('li').count().then(function(listLength)
{
if(listlength>1)
{
"doing some calculation
flag=false;
}
});
}}
我的问题:在上面的代码中,标志值更改为false,这将限制第二次迭代中的第一个IF块执行。 不会发生...因为标志值保留在THEN函数内和THEN函数之外,所以标志值始终为真。
如何解决此问题。请有人指导我。
答案 0 :(得分:1)
您的问题与flag
变量的 scope 和与异步JavaScript 无关。
以下是简化的表示形式,可帮助您了解发生了什么:
var flag = false;
for (var i = 0; i < 100; i++) {
if(flag){
console.log('Flag has been set!');
break;
} else {
console.log('Flag not set yet :(');
if(i === 3){
flag = true;
}
setTimeout(function(){ console.log('Async callback finally happened! '); }, 1000);
}
}
与setTimeout()
函数一样,您的element(by.xpath("abc")).all(tagName('li').count().then(..)
函数调用也是异步的。唯一的区别是setTimeout()
正在等待回调,而您的函数正在等待诺言的解决。
通知:如何将flag
变量设置为true,并且for
循环将在触发setTimeout()
回调之前很长一段时间中断。这说明了flag
变量的 scope 不是问题。 代码中可能发生的情况是,for
循环在第一次兑现承诺之前就已完成。
其他要点,从控制台输出中注意到,setTimeout()
循环每次循环都调用一次for
。您的代码也发生了同样的结果。对于您的for循环的每个单次迭代,您都将调用element(by.xpath("abc")).all(tagName('li').count().then(..)
,这显然是不可取的或不理想的。
此外,如果您选择使用var
或let
和const
,则应该坚持使用后者,这将有助于防止潜在的范围界定问题。