for循环与迭代之间的睡眠

时间:2017-12-03 22:15:03

标签: javascript typescript

我有一个gigatic嵌套for循环,需要在nested loopelse block的每次迭代中每1秒睡一次。这通常使用以下代码执行:

for (let i=1; i<10; i++) {
    setTimeout( function timer(){
        alert("hello world");
    }, i*3000 );
}

我正在读这个内存非常密集,不应该使用它。

到目前为止,这是我的代码:

  for (var i = 0; i < this.data.length; i++) {
    if (this.data[i].dataTypes.length > 0) {
      for (var j = 0; this.data[i].dataTypes.length; j++) {
        //performed each second
        this.setData(this.data[i].dataName, this.data[i].dataTypes[j]);
      }
    } else {
      //performed each second
      this.setData(this.data[i].dataName, "");
    }
  }

我应该如何重写它以便嵌套循环,或者每秒执行一次块?

2 个答案:

答案 0 :(得分:3)

如果你不喜欢循环,你可以做

function sleep(n){
    return new Promise(res => setTimeout(res, n));
}

async function doStuff(){
    for(let element of myList){
        doMoreStuff();
        await sleep(1000);
    }
}

https://jsfiddle.net/DerekL/y7m0qv51/

function doStuff(i){
    doMoreStuff(myList[i]);
    setTimeout(() => doStuff(i + 1), 1000);
}

https://jsfiddle.net/DerekL/rh8m6h94/

但你应该意识到这些都不被认为更有效率。

答案 1 :(得分:1)

一种方法是使用setTimeout()作为尾端递归的形式。

例如

var index = 0
var process = function() {
       if( something )  {
        do_something();
      } else {
        do_something_else();
      }
     index = index + 1;
     if( index < this.data.length ) {
         setTimeout( process, 1000 );
     }
};
process();

请注意&#39;这个&#39;关于回调,有点挑剔。你可能会 需要使用&#39; setTimeout(process.bind(this),1000)&#39;确保这个&#39;在回调中正确设置。