如何使用异步/等待创建同步循环

时间:2018-01-08 11:48:02

标签: javascript asynchronous promise async-await

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

这是我的测试用例。了解如何将所有内容组合在一起而不是逐页打印

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();

1 个答案:

答案 0 :(得分:3)

就像我在评论中提到的那样,地图不是承诺意识。还有像Bluebirds.map这样的替代品,但是容易的选择是使用for循环,..

保持您的示例是您想要循环数组,您也可以使用for of变体。更改为for (let a = 1; a <= 10; a ++)也会有效。

例如

&#13;
&#13;
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();
&#13;
&#13;
&#13;

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