美文网首页好技术
foreach 不能使用 await

foreach 不能使用 await

作者: 折叠幸福 | 来源:发表于2021-04-25 13:32 被阅读0次

问题场景:
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

    问题场景:nodejs,koa有一个商品表和一个订单表,浏览器发送一次创建新订单请求.该请求数组,元素由商品id和...

  • 前端代码技巧 - js(1)

    InputNumber 只允许输入正整数 forEach中不能使用async / await 现象: 在forEa...

  • await不能用于foreach的解决方案

    今天在做一个模拟队列任务执行的功能的时候,发现使用await不能使用foreach,后来发现使用for...of或...

  • js循环中的异步

    for循环await、async这样就没问题foreach不支持await,asyncmap:

  • flutter foreach 的await问题

    一、改用for循环 二、用await Future.forEach

  • 循环

    1. forEach kotlin 中可以使用 forEach遍历数组 forEach 中不能使用break,co...

  • [学习笔记] 数组遍历方法比较

    1. for循环 2. forEach 注意: forEach不能使用break语句中断循环,也不能使用retur...

  • js循环

    for循环 forEach 但是forEach不能中止或者中途跳出循环,即不能使用break,continue这些...

  • 关于异步

    如何循环同步调接口 for+await map和foreach为什么不行?原理应该是foreach内部封装了whi...

  • async await 与 forEach()一起用坏的味道

    趟过的一个坑:Array.forEach与 async await一起使用,并没有达到自己预期的效果,后面查询资料...

网友评论

    本文标题:foreach 不能使用 await

    本文链接:https://www.haomeiwen.com/subject/mwkdrltx.html