如何使用打字稿延迟对foreach循环内的api调用?

时间:2017-08-15 19:15:11

标签: javascript typescript

我正试图在for loop内的api通话之间设置延迟。 我尝试过使用setTimeout()而没有任何运气。

以下是代码:

for(let pc = 0; pc < this.cModel.stuff.length; pc++)
{   
   for(let mc = 0; mc < this.cModel.stuff[pc].otherStuff.length; mc){
       let mp = this.mcModel.stuff[pc].otherStuff[mc];

       //method that calls api ***need delay***
       this.callCancel(mp.key, cp.key);
   }
}
private (mpkey: string, cpkey: string){
       //code that builds up object *obj
       //for api call here

       this.executeApiCallHere(obj);
    }

以下是我尝试的内容:

  • 我已经尝试将setTimeout()放在forloop中:

    setTimeout(this.callCancel(mp.key, cp.key), 1000);
    
  • 我已经尝试将setTimeout()放在调用api的方法中:

    setTimeout(() => { this.executeApiCallHere(obj);}, 1000);
    
  • 我已经尝试将setTimeout()放在forloop周围:

    setTimeout(function () { ......code ....}, 1000);
    

所有上述结果在两次通话之间没有延迟。 我应该如何在打字稿中处理这个问题,以便foreach中的forloop项在调用之间有延迟?

2 个答案:

答案 0 :(得分:2)

如果你运行一个循环10次并在该循环中用1秒钟调用setTimeout,结果将是1秒延迟,然后快速继续点燃你已经延迟的回调。结果是初始延迟,但调用之间没有延迟

如果要在呼叫之间延迟,则必须增加每次setTimeout呼叫之间的超时。您可以使用计数器或使用for循环中的值(取决于您调用它的位置)来执行此操作。

实施例

var timeoutSeconds = 1;

for(let pc = 0; pc < this.cModel.stuff.length; pc++)
{   
   for(let mc = 0; mc < this.cModel.stuff[pc].otherStuff.length; mc){

      setTimeout(() => this.callCancel(mp.key, cp.key), 1000 * timeoutSeconds);
      timeoutSeconds++;

   }
}

答案 1 :(得分:1)

async / await是你的朋友:

0.7179876668378711
0.5230729999020696
0.4444526666775346
0.3233160013332963