await 不能用在 forEach

博客探讨了在JavaScript中forEach处理异步请求的问题,指出forEach不支持异步操作并分析其内部机制。解决方案包括提前保存数据和使用for...of循环。for...of通过迭代器方式遍历,能正确处理异步操作。文章强调了理解和掌握异步控制流程的重要性。
摘要由CSDN通过智能技术生成

在这里插入图片描述
在这里插入图片描述

通过打印发现是先走了 走到forEach里面接口请求的时候 没有等待 就直接走了forEach外面的点击保存

问题分析

forEach 只支持同步代码
polyFill的forEach的源码

差不多就是下面这个代码这么个意思

while (index < arr.length) {
      callback(item, index)   //也就是我们传入的回调函数
    }

通过阅读polyfill的forEach源码,发现,forEach 只是简单的执行了下回调函数而已,并不会去处理异步的情况。并且你在 callback 中即使使用 break 也并不能结束遍历。

解决方案

解决方案有两种,

  1. 是 我将在forEach中的请求挪到了进入页面初始化的时候 将值保存下来,这样在forEach的时候 就是个同步,不需要在请求

  2. 使用 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')
 }
function fetch(x) {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
		resolve(x)
		}, 500 * x)
	})
}

调用test这个函数发现,是按照3,2,1,end这个顺序打印下来的 ,然后为啥for of就好使呢?
for…of 内部处理的机制和 forEach 不同,forEach 是直接调用回调函数,for…of 是通过迭代器的方式去遍历

迭代器的概念 就是

就是遍历器,它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值