foreach 不能使用 await

问题场景:
nodejs,koa
有一个商品表和一个订单表,浏览器发送一次创建新订单请求.
该请求数组,元素由商品id和商品数量组成,服务端接收后,查商品表,更新每个商品总数

开始用的foreach,报语法错误浏览器可能不报错但不是期望效果,原因如下
foreach是同步执行,async是异步的

比如示例代码

    function test() {
     let arr = [3, 2, 1]
     arr.forEach(async item => {
      const res = await fetch(item)
      console.log(res)
     })
     console.log('end')
    }
    
    function fetch(x) {
     return new Promise((resolve, reject) => {
      setTimeout(() => {
       resolve(x)
      }, 500 * x)
     })
    }
    
    test()

解决办法
1.不在意执行顺序
用map转成一个存放promise数组,然后promise.all执行

   async function test() {
    let arr = [3, 2, 1]
    await Promise.all(
     arr.map(async item => {
      const res = await fetch(item)
      console.log(res)
     })
    )
    console.log('end')
   }

2.在意执行顺序
采用for of,或者for循环
for of主要是迭代遍历目标

    async function test() {
     let arr = [3, 2, 1]
     for (const item of arr) {
      const res = await fetch(item)
      console.log(res)
     }
     console.log('end')
    }

参考博客
博客一
博客二

额外的:for of和for in的区别
for in循环可枚举属性,for of只循环可迭代的属性值

Object.prototype.objCustom = function () {}; 
Array.prototype.arrCustom = function () {};

let iterable = [3, 5, 7];
iterable.foo = "hello";

for (let i in iterable) {
  console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom"
}

for (let i of iterable) {
  console.log(i); // logs 3, 5, 7
}

你可能感兴趣的:(foreach 不能使用 await)