需求:
- 有一个二维或多维数组,现在需要将数组的中每一项,间隔一定时间,按顺序输出
- 例如
arr[[1,2,3],[4,5,6]],输出效果为:0+-- 1+-- 2+-- 31+-- 4+-- 5+-- 6
在普通for循环中可以轻松实现,但是一旦加上 setTimeout就会失效
未使用setTimeout(无法满足需求,间隔一定时间)
for (let i = 0; i < arr.length; i++) {console.log(`第${i}个容器`);for (let j = 0; j < arr[i].length; j++) {console.log(`+---第${i}个容器中的第${j}个值: ${arr[i][j]}`);}}

使用setTimeout(无法满足需求,按顺序依次执行)
因为js是单线程环境,从上到下、依次执行,即 同步执行;在下面这段代码中,for循环是同步代码,setTimeout是异步代码。 js在执行代码的过程中,碰到同步代码会依次执行,碰到异步代码就会将其放入任务队列中进行等待,当同步代码执行完毕后再开始执行异步代码,即 异步执行。
for (let i = 0; i < arr.length; i++) {console.log(`第${i}个容器`);for (let j = 0; j < arr[i].length; j++) {setTimeout(() => {console.log(`+---第${i}个容器中的第${j}个值: ${arr[i][j]}`);}, 1000);}}

解决办法:
- 使用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 }个容器);
for (let j = 0; j < arr[i].length; j++) {const output = new Promise((resolve, reject)=>{return setTimeout(()=>{return resolve(`+---第${i}个容器中的第${j}个值: ${arr[i][j]}`)}, 1000)})console.log(await output);}
}
}
main (arr)
```

