我想用一个异步回调函数迭代Map的条目.应该立即为所有元素启动回调函数.

我最终得到了以下代码,它可以工作,但看起来太复杂了:

async function test() {
  const map1 = new Map();

  map1.set('a', 1);
  map1.set('b', 2);
  map1.set('c', 3);

  await Promise.all(Array.from(map1.entries()).map(async([
    key,
    value
  ]) => {
    await doSomeThing(key, value);
    await doSomeOtherThing(key, value);
  }
}

有没有更简单的方法来实现这一点?

推荐答案

你可以做一些更短的

  • Array.from(map1.entries())可以重写为[...map1]
  • 在我看来,doSomeOtherThing不依赖于doSomeThing,所以我们可以同时称它们为两个
await Promise.all(
  [...map1].flatMap(([key, val]) => [
    doSomeThing(key, val),
    doSomeOtherThing(key, val),
  ])
)

const doSomeThing = (key, val) =>
  new Promise(res => {
    console.log("doSomeThing start", key, val)
    setTimeout(() => {
      console.log("doSomeThing finish", key, val)
      res()
    }, 1000)
  })
const doSomeOtherThing = (key, val) =>
  new Promise(res => {
    console.log("doSomeOtherThing start", key, val)
    setTimeout(() => {
      console.log("doSomeOtherThing finish", key, val)
      res()
    }, 2000)
  })

async function test() {
  const map1 = new Map()

  map1.set("a", 1)
  map1.set("b", 2)
  map1.set("c", 3)

  /*
  await Promise.all(
    Array.from(map1.entries()).map(async ([key, value]) => {
      await doSomeThing(key, value)
      await doSomeOtherThing(key, value)
    })
  )
  */

  await Promise.all(
    [...map1].flatMap(([key, val]) => [
      doSomeThing(key, val),
      doSomeOtherThing(key, val),
    ])
  )
}

test().then(() => {
  console.log("done")
})

Javascript相关问答推荐

如何使用3个部件之间的路由?

如何在react + react路由域名中使用DeliverBrowserRouter?

Angular material 表多个标题行映射

使用typeof运算符获取对象值类型-接收字符串而不是数组

使用axios.获取实时服务器时的404响应

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

如何将Map字符串,布尔值转换为{key:string;value:bo布尔值;}[]?<>

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

如何让npx在windows中运行js脚本?

我怎么才能得到Kotlin的密文?

S文本内容和值不必要的不同

如何在文本字段中输入变量?

在Java中寻找三次Bezier曲线上的点及其Angular

邮箱密码重置链接不适用于已部署的React应用程序

如何在JAVASCRIPT中临时删除eventListener?

如何 for each 输入动态设置输入变更值

回溯替代方式

Phaser3 preFX addGlow不支持zoom

Node.js错误: node 不可单击或不是元素

更改agGRID/Reaction中的单元格格式