需求:

  • 有一个二维或多维数组,现在需要将数组的中每一项,间隔一定时间,按顺序输出
  • 例如 arr[[1,2,3],[4,5,6]],输出效果为:
    1. 0
    2. +-- 1
    3. +-- 2
    4. +-- 3
    5. 1
    6. +-- 4
    7. +-- 5
    8. +-- 6

在普通for循环中可以轻松实现,但是一旦加上 setTimeout就会失效

  • 未使用setTimeout(无法满足需求,间隔一定时间)

    1. for (let i = 0; i < arr.length; i++) {
    2. console.log(`第${i}个容器`);
    3. for (let j = 0; j < arr[i].length; j++) {
    4. console.log(`+---第${i}个容器中的第${j}个值: ${arr[i][j]}`);
    5. }
    6. }

    image.png

  • 使用setTimeout(无法满足需求,按顺序依次执行)

    因为js是单线程环境,从上到下、依次执行,即 同步执行;在下面这段代码中,for循环是同步代码,setTimeout是异步代码。 js在执行代码的过程中,碰到同步代码会依次执行,碰到异步代码就会将其放入任务队列中进行等待,当同步代码执行完毕后再开始执行异步代码,即 异步执行。

  1. for (let i = 0; i < arr.length; i++) {
  2. console.log(`第${i}个容器`);
  3. for (let j = 0; j < arr[i].length; j++) {
  4. setTimeout(() => {
  5. console.log(`+---第${i}个容器中的第${j}个值: ${arr[i][j]}`);
  6. }, 1000);
  7. }
  8. }

image.png

解决办法:

  • 使用Promise async / await ```javascript let arr = [[1, 2, 3], [4, 5, 6]]

async function main(arr) { for (let i = 0; i < arr.length; i++) { console.log(第${ i }个容器);

  1. for (let j = 0; j < arr[i].length; j++) {
  2. const output = new Promise((resolve, reject)=>{
  3. return setTimeout(()=>{
  4. return resolve(`+---第${i}个容器中的第${j}个值: ${arr[i][j]}`)
  5. }, 1000)
  6. })
  7. console.log(await output);
  8. }

} } main (arr) ``` image.png