在调用接口上map与forEach的区别

在场景:一个表格数据需要上传,每行表格需要上传图片->这就需要在提交时对数据也就是数组进行处理(先将每个元素图片上传拿到图片id

这种情况我刚开始就用的map处理,然后问题来了,提交的接口调用了,但是上传图片的接口没调用,用了async await也没用

let shopContactList = editForm.value.shopContacts.map(async (item: any) => {
        let middle: any
        if (item.fileList.length && !item.wechatCodeImageID) {
            middle = await uploadImage(item.fileList[0])
        }
        return {
            name: item.name,
            phone: item.phone,
            wechatCodeImageID: middle,
        }
    })

->然后我就用了forEach去处理

 let shopContactList: any = []

    editForm.value.shopContacts.forEach(async (item: any) => {
        let middle: any
        if (item.fileList.length && !item.wechatCodeImageID) {
            middle = await uploadImage(item.fileList[0])
        }
        shopContactList.push({
            name: item.name,
            phone: item.phone,
            wechatCodeImageID: middle,
        })
    })

虽然上传图片接口调用了,提交的数据打印出来也有,but->提交接口传递的数据没用,这就很无语,原因:uploadImage 函数是异步的,可能会导致在 formEl.validate 的回调函数执行之前,shopContactList 还没有被填充。所以->修改为(使用 Promise.all 来等待所有异步操作完成,然后再执行 formEl.validate):

    let shopContactList: any = []
    await Promise.all(
        editForm.value.shopContacts.map(async (item: any) => {
            let middle: any
            if (item.fileList.length && !item.wechatCodeImageID) {
                middle = await uploadImage(item.fileList[0])
            }
            shopContactList.push({
                name: item.name,
                phone: item.phone,
                wechatCodeImageID: middle,
            })
        })
    )

,这里又为啥不用forEach呢,因为 forEach 方法不会等待异步操作,就报这个错误:undefined是不可迭代的

回答: map()和forEach()都是数组的方法,但它们在功能和用法上有一些区别map()方法创建一个新的数组,其中每个元素都是通过调用提供的函数对原数组中的每个元素进行处理得到的。而forEach()方法则是对数组中的每个元素执行提供的函数,但它没有返回一个新的数组。\[1\]\[2\] 另外,map()方法适用于需要改变数据值并返回一个新数组的情况。它的优点在于可以与其他数组方法(如filter()和reduce())进行组合使用,实现更复杂的操作。而forEach()方法则更适合在遍历数组时执行一些操作,但不能中止或跳出循环。\[2\]\[3\] 总结来说,map()方法适用于需要对数组中的每个元素进行处理并返回一个新数组的情况,而forEach()方法适用于遍历数组并执行一些操作的情况。 #### 引用[.reference_title] - *1* *2* [map()和forEach()的区别和理解](https://blog.csdn.net/suwu150/article/details/111590409)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [foreachmap区别](https://blog.csdn.net/lhm666666/article/details/126657703)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Angus-zoe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值