我有一个gigatic嵌套for循环,需要在nested loop
或else 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, "");
}
}
我应该如何重写它以便嵌套循环,或者每秒执行一次块?
答案 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;在回调中正确设置。