首页 > 解决方案 > 如何在量角器中使用变量值

问题描述

我正在“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,这应该限制第 2 次迭代中的第一个 IF 块执行。没有发生...因为标志值保留在 THEN 函数内和 THEN 函数外部,所以标志值始终为真。

如何解决这个问题。请有人指导我。

标签: javascriptnode.jsprotractor

解决方案


您的问题与变量的范围无关,与异步 JavaScript无关。flag

这是一个简化的表示,以帮助理解正在发生的事情:

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()这表明变量的范围不是问题。您的代码中可能发生的情况是您的循环在您的承诺第一次解决之前完成。flagfor

附加要点注意setTimeout()每次for循环迭代时都会调用的控制台输出。您的代码也会出现同样的结果。您将调用element(by.xpath("abc")).all(tagName('li').count().then(..)for 循环的每一次迭代,这显然是不可取的或高性能的。此外,您应该坚持使用varOR let&const如果您选择后者,它将帮助您防止潜在的范围问题。


推荐阅读