Javascript 带承诺的量角器变量范围 背景

Javascript 带承诺的量角器变量范围 背景,javascript,angularjs,protractor,javascript-objects,Javascript,Angularjs,Protractor,Javascript Objects,我正在开发一个Angular应用程序,它使用ng repeat制作一张桌子。其中一个用户发现表中有时包含重复的条目,我通过视觉确认了这一点,然后立即为其编写了一个量角器测试 测试 可变范围问题 在编写测试时,我注意到作用域的行为方式与我理解的不同 当然,第61行上的for循环可以访问linkStorage(第38行),因为它在更高的范围内。它记录所有对象都已通过第47行承诺中的for循环成功添加到对象 但是,当我将确认循环移到承诺之外时,比如说,在expect块之前 …linkStorage

我正在开发一个Angular应用程序,它使用ng repeat制作一张桌子。其中一个用户发现表中有时包含重复的条目,我通过视觉确认了这一点,然后立即为其编写了一个量角器测试

测试

可变范围问题 在编写测试时,我注意到作用域的行为方式与我理解的不同

当然,第61行上的for循环可以访问
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