Javascript 带承诺的量角器变量范围 背景
我正在开发一个Angular应用程序,它使用ng repeat制作一张桌子。其中一个用户发现表中有时包含重复的条目,我通过视觉确认了这一点,然后立即为其编写了一个量角器测试 测试 可变范围问题 在编写测试时,我注意到作用域的行为方式与我理解的不同 当然,第61行上的for循环可以访问Javascript 带承诺的量角器变量范围 背景,javascript,angularjs,protractor,javascript-objects,Javascript,Angularjs,Protractor,Javascript Objects,我正在开发一个Angular应用程序,它使用ng repeat制作一张桌子。其中一个用户发现表中有时包含重复的条目,我通过视觉确认了这一点,然后立即为其编写了一个量角器测试 测试 可变范围问题 在编写测试时,我注意到作用域的行为方式与我理解的不同 当然,第61行上的for循环可以访问linkStorage(第38行),因为它在更高的范围内。它记录所有对象都已通过第47行承诺中的for循环成功添加到对象 但是,当我将确认循环移到承诺之外时,比如说,在expect块之前 …linkStorage
linkStorage
(第38行),因为它在更高的范围内。它记录所有对象都已通过第47行承诺中的for循环成功添加到对象
但是,当我将确认循环移到承诺之外时,比如说,在expect
块之前
…linkStorage
是一个空对象
在对象上循环找不到嵌套的键值对;它确实是空的
问题(tl;dr)
为什么linkStorage
对象填充在then语句中,但不在预期之前?异步性再次出现
第一个例子是由于异步性。因为.getAttribute
方法是非阻塞的,所以代码在工作时会继续运行。因此,在填充对象之前到达控制台循环;它是空的
如果给异步代码一些运行时间,可能需要一秒钟:
…已填充链接存储
完全解
将多个承诺链接在一起,以确保代码在正确的时间运行
it('should not have duplicates within the match grid', function() {
// Already on job A, with match grid shown.
var duplicate = false;
var linkStorage = {};
// Save unique links
var uniqueUserLinks = element.all(by.css('div.row table tbody tr td a'));
// get an array of href attributes
uniqueUserLinks.getAttribute('href')
.then(function(hrefs) {
// add the links to the linkStorage object
for (var i = 0; i < hrefs.length; i++) {
// if the link is already there
if( linkStorage[ hrefs[i] ] ) {
// update its counter
linkStorage[hrefs[i]] += 1
duplicate = true;
// there's already one duplicate, which will fail the test
break;
} else {
// create a link and start a counter
linkStorage[hrefs[i]] = 1;
}
};
}).then(function() {
// confirm links have been added to storage
for(var link in linkStorage) {
console.log('link:', link );
console.log('number:', linkStorage[link] );
}
}).then(function() {
expect(duplicate).toBe(false);
});
});
it('匹配网格中不应存在重复项',函数(){
//已在作业A中,显示匹配网格。
var duplicate=false;
var linkStorage={};
//保存唯一链接
var uniqueUserLinks=element.all(by.css('div.row table tbody tr td a');
//获取href属性数组
uniqueUserLinks.getAttribute('href')
.then(函数(hrefs){
//将链接添加到linkStorage对象
对于(var i=0;i