2017-10-13 67 views
1

我是JavaScript概念的新手。 为什么我得到不同的输出为相同的变量长度? 虽然它在体内显示预期的结果?无法获得长度

var length; 
element.all(by.className("className")).getText().then(function(items){ 
    length = items.length; 
    console.log("1st output = "+length);//1 
    console.log("2nd output = "+items.length);//1 
}); 
console.log("3rd output = "+length);//undefined 

输出: - 1输出= 1个

第二输出= 1个

3个输出=不确定

+2

3rd未定义,因为它是异步调用。 –

+1

'.then'以异步方式工作,当'.then'里面的代码执行了语句'console.log(“3rd output =”+ length)''已经完成它的执行并且当时'length'是undefined ..你可以检查这个链接 https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call – brk

回答

2

因为你all()是异步调用,这样完成then链之前console.log将运行并赋值为length

1

element.all(by.className("className")).getText())你的函数调用返回一个叫promise的东西 - 它执行一些代码,执行这段代码后,它调用.then()中的函数。但是,这种情况独立于程序的其余部分,所以它继续在.then()声明后执行console.log

这导致了所谓的竞争条件 - 操作顺序可能是未定义的。

+0

我应该怎么做才能解决它。想要项目的长度。 –

+0

@shankarDayalupadhyay你打算如何使用该项目的长度?有没有什么方法可以在同步函数中使用它? –

+0

我想比较外部项目的长度。 –

1

所有之前的答案已经解释发生了什么,为什么。很明显,您的第3个console.log在您的then()条件完成之前执行。

什么,你可以尝试是这样的:

var length; 
element.all(by.className("className")).getText().then(function(items){ 
    length = items.length; 
    console.log("1st output = "+length);//1 
    console.log("2nd output = "+items.length);//1 
}); 
browser.waitForAngular(); //add this line to let Protractor wait for Async tasks to be resolved first 
console.log("3rd output = "+length); 

然而,保持第3的console.log()的then()语句内将是更合适的解决方案。

+0

嗨,如果我的应用程序不是角度可以使用browser.waitForAngular()? –

+0

不,这不会作为'browser.waitForAngular()'在角度特定的对象上解析。我建议以'async/await'作为纯JavaScript方式。无论如何,量角器将在未来12-18个月内在那里移动。 [阅读所有关于此处](https://stackoverflow.com/a/46660193/8683679) –

+0

@shankarDayalupadhyay:它没有工作或者不接受答案的原因是什么?如果可以的话,我想改进它(因为看起来你还有一个没有答案的问题)。 –