如何以特定顺序遍历各种端点

时间:2017-03-27 08:14:47

标签: angularjs angular typescript

我需要在不同的登录凭据下测试各种端点。我目前正在循环遍历所有端点,但结果不会按照它们被调用的顺序出现,因为它们是异步的。

我需要使用特定密码遍历每个端点,并将结束点的结果推送到array1,然后使用password2获取端点的结果并将其推送到array2。

array1应该使用password1等于所有终点的结果 array2应该使用password2等于所有终点的结果

public runTests(endPoints, pass1, pass2):void {
  for (let i = 0; i < endPoints.length; i++) {
   this.test(endPoints[i], user1, pass1).then(result => {
    this.array1.push(result);
   });

   this.test(endPoints[i], user2, pass2).then(result => {
    this.array2.push(result);
   });
  }
}

我目前正在从我试图成功测试的所有端点获得结果,而不是确定我将如何将它们按照它们被称为任何建议的顺序存储在数组中,或者非常感谢协助。

2 个答案:

答案 0 :(得分:0)

将两个this.test异步函数调用包装到阻塞范围中,以通过在一个位置自行执行函数来保留i的值。

<强>代码

public runTests(endPoints, pass1, pass2): void {
  for (let i = 0; i < endPoints.length; i++) {
    //self executing function
    ((index) => {
      this.test(endPoints[index], user1, pass1).then(result => {
        this.array1.push(result);
      });

      this.test(endPoints[index], user2, pass2).then(result => {
        this.array2.push(result);
      });
    })(i); //passing value of `i`.
  }
}

答案 1 :(得分:0)

要以相同的顺序调用所有承诺,您可以使用Promise支持使用then严格按顺序在单个流中链接其他承诺:

var p = new Promise();

for (let i = 0; i < endPoints.length; i++) {
   p = p.then(function(index) {
     return this.test(endPoints[index], user1, pass1).then(result => {
       array1.push(result);
     })
   })(i));
}

p.then(function() {console.log(array1});

另外,请注意,您需要将异步调用包装到IIFE函数中以创建闭包并避免出现范围i的问题。