js,多层for循环嵌套下的异步,怎样按顺序执行?

发布于 2022-09-11 16:15:28 字数 610 浏览 16 评论 0

题目描述

需要像同步执行那样,按照理想的顺序打印

题目来源及自己的思路

这是一个实际需求简化后的问题

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

for (let i = 0; i < 10; i ++) {
    setTimeout(() => {
        console.log(`这是外层${i}`);
    }, 1000);
    for (let j = 0; j < 5; j ++) {
        setTimeout(() => {
            console.log(`这是内层的${j}`);
        }, 1000);
    }
}

你期待的结果是什么?实际看到的错误信息又是什么?

希望可以像同步一样,打印出以下结果,并且每次间隔1秒

这是外层0
这是内层的0
这是内层的1
这是内层的2
这是内层的3
这是内层的4
这是外层1
这是内层的0
这是内层的1
这是内层的2
这是内层的3
这是内层的4
……

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ぺ禁宫浮华殁 2022-09-18 16:15:28

async+await才是真正解决方式

(async function () {

  const Timeout = (time) => {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve()
      }, time);
    })
  };

  for (let i = 0; i < 10; i++) {
    await Timeout(1000);
    console.log(`这是外层${i}`);
    for (let j = 0; j < 5; j++) {
      await Timeout(1000);
      console.log(`这是内层的${j}`);
    }
  }

})()

图片描述

唐婉 2022-09-18 16:15:28

如果只是间隔1秒,那么这么做就行

let time = 0;
for (let i = 0; i < 10; i++) {
    time += 1000
    setTimeout(() => {
        console.log(`这是外层${i}`);
    }, time);
    for (let j = 0; j < 5; j++) {
        time += 1000;
        setTimeout(() => {
            console.log(`这是内层的${j}`);
        }, time);
    }
}

然而这没有解决同步的问题,代码并不是等上一个执行完了才执行的.你需要的可能是async/await


async function print(msg) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, 1000, msg)
    })
}

async function main() {
    for (let i = 0; i < 10; i++) {
        console.log(await print("外部" + i));
        for (let j = 0; j < 5; j++) {
            console.log(await print("内部" + j))
        }
    }
}

main()

这样其实可以,这个Promise+await有点绕,熟悉了才能灵活点运用

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文