异步循环问题

发布于 2022-09-11 23:23:24 字数 364 浏览 22 评论 0

问题描述

问题出现的环境背景及自己尝试过哪些方法

我知道事件执行的过程及机制,但一直想不到有什么优雅的写好,求指教。

相关代码

let arr = []
  for (let i = 0; i < 5; i++) {
    Promise.resolve(1).then(() => {
        console.log(i)
        arr.push(i)
    })
}
//想在arr里面获取[0,1,2,3,4] 有什么好的写法
console.log(arr)

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

想在外面拿到处理后的数据

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

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

发布评论

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

评论(5

为你拒绝所有暧昧 2022-09-18 23:23:24
const test = async ()=>{
  let arr = []
  for (let i = 0; i < 5; i++) {
    const j = await new Promise(resolve=>{
      Promise.resolve(1).then(() => {
        console.log(i);
        resolve(i)
      })
    })
    arr.push(j)
  }
console.log(arr)

}

test();
若言繁花未落 2022-09-18 23:23:24

异步非顺序执行的话 就promise.all 顺序的话可以用async await 转化成 非异步

︶ ̄淡然 2022-09-18 23:23:24

应该是这样吧

let arr = []
new Promise((resolve, reject) => {
    for (let i = 0; i < 5; i++) {
        arr.push(i)
    }
    resolve()
}).then(() => {
    // 在这里输出结果
    console.log(arr)
})
陈年往事 2022-09-18 23:23:24

这样是不是会简洁一点:

let a = [0,1,2,3,4].reduce((pre, cur) => pre.then(res => res.concat(cur)), Promise.resolve([]))

a.then(res => console.log(res)) // [ 0, 1, 2, 3, 4 ]
盗琴音 2022-09-18 23:23:24

WHY:for循环的Promise.resolve()为微任务队列;console.log(arr)为同步代码;同步代码会先于微任务队列执行,所以打印的结果为空数组[]。
HOW:
方式1:我们知道EventLoop中微任务可以enqueue微任务,所以可以把console.log(arr)放到一个后续的微任务中
方式2:task queue(比如定时器)会在微任务队列之后执行,可以把console.log(arr)放到setTimeout中。(不优雅)

总之,写法有很多种,熟悉EventLoop机制是根本

// 在最后加上以下代码
Promise.resolve().then(() => {
  console.log(arr)
})
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文