【问题标题】:How to create a synchronized loop with async/wait [duplicate]如何使用异步/等待创建同步循环 [重复]
【发布时间】:2018-06-17 09:30:22
【问题描述】:

我正在尝试使用 async await 创建一个“同步循环”,但我得到了一个奇怪的行为,即在第一个 Promise 之后获取所有结果。

这是我的测试用例。看看你是如何聚在一起的,而不是一个接一个地打印

const p = () =>  new Promise((resolve) =>{
   setTimeout(()=>{
       resolve(Math.floor(Date.now() / 1000))
   },1000)

})

const test =  () =>{

 [1,2,3,4,5,6,7,8,9,10].map(async () =>{
      const e = await p();
      console.log(e)
  });
  
}

test();

【问题讨论】:

  • map 不适用于aync / await 但如果你使用了 bluebird promise,它确实有一个基于 promise 的 map。或者,在您的示例中,for 循环可以工作。

标签: javascript asynchronous promise async-await


【解决方案1】:

就像我在 cmets 中提到的,map 不是 Promise 感知的。有像Bluebirds.map这样的替代品,..但简单的选择是使用for循环,..

按照您的示例,如果您想要循环一个数组,您也可以使用 for of 变体。更改为 for (let a = 1; a <= 10; a ++) 也可以。

例如。

const p = () =>  new Promise((resolve) =>{
   setTimeout(()=>{
       resolve(Math.floor(Date.now() / 1000))
   },1000)

})

const test =  async () =>{
 for (const a of [1,2,3,4,5,6,7,8,9,10]) {
   const e = await p();
   console.log(e)
 }  
}

test();

还值得指出的是,bluebirds 地图还有另一个窍门,它有一个并发选项。这对于防止Promise.all 可能发生的颠簸非常方便,你基本上说你想一次做x 承诺,例如。你有 10 个 promise 要做,但你发现同时做 3 个更合适。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 2020-05-12
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多