如何在量角器之外使用变量值

时间:2018-07-20 15:43:22

标签: javascript node.js protractor

我正在“ 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函数之外,所以标志值始终为真。

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

1 个答案:

答案 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(..),这显然是不可取的或不理想的。 此外,如果您选择使用varletconst,则应该坚持使用后者,这将有助于防止潜在的范围界定问题。