For循环与setTimeout?

For loop with setTimeout?

我有一个功能可以显示所有对象。

queries = {
  "info": {
    "query": "SELECT ...",
    "id": "10"
  },
  "info2": {
    "query": "INSERT ...",
    "id": "12"
  },
  "infoN": {
    "query": "DELETE ...",
    "id": "123"
  }
}

for (var [key, value] of Object.entries(queries)) {
    let name = key;
    let query = value.query;
    let id = value.id;

    console.log(name);
    console.log(query);
    console.log(id); 
    //setTimeout(function() { }, 3000);
}

但我需要显示第一个对象,然后在 3 秒后显示另一个对象,依此类推。 我怎样才能用 setTimeout 循环它们?或者类似的东西?

最简单的方法是在每次调用 setTimeout 时使用不同的延迟

let counter = 1
for (...){
    setTimeout(function() { }, 3000 * counter++);
}

因为 Object.entries returns 是一个数组,我们也可以在 for 语句中使用 Arrray.entries 来获取迭代计数器。

queries = {
  "info": {
    "query": "SELECT ..."
  },
  "info2": {
    "query": "INSERT ..."
  },
  "infoN": {
    "query": "DELETE ..."
  }
}

for (let [counter, [key, value]] of Object.entries(queries).entries()) {
  const delay = (counter + 1) * 1000
  setTimeout(() => {
    console.log({
      counter,
      delay,
      key,
      value
    })
  }, delay)
}

虽然我认为直接设置 counter 也很容易阅读。

将所有 console.log 语句放在 setTimeout 中。

queries = {
  "info": {
    "query": "SELECT ...",
    "id": "10"
  },
  "info2": {
    "query": "INSERT ...",
    "id": "12"
  },
  "infoN": {
    "query": "DELETE ...",
    "id": "123"
  }
}

var i = 1;

for (var [key, value] of Object.entries(queries)) {
    let name = key;
    let query = value.query;
    let id = value.id;
    setTimeout(function(){ 
        console.log(name);
        console.log(query);
        console.log(id); 
        }, 3000* i);
   i++;
}