await遇上map

本文讨论了在JavaScript中,如何处理map函数返回Promise的问题,通过Promise.all和reduce等方法实现Promise数组的正确处理,以及如何应用filter函数在异步环境下筛选数据。
摘要由CSDN通过智能技术生成

1、场景:

data.map(async (item) => {
  const { data } = await requestService(item.id)
  return {
    key: item.id,
    title: item.name,
    value: item.id,
    children: data
  }
})

2、期望结果:

[{key: xx, title: xx, value: xx, children: []}]

3、实际结果:

[Promise, Promise, Promise]

4、解决办法:

async函数执行完会返回Promise对象,map就直接接收后装进新数组了,数组内容直接变成了三个Promise,这显然不是我们想要的结果,所以我们要对Promise数组再进一步操作取出其中的值。

Promise.all会将一个由Promise组成的数组依次执行,并返回一个Promise对象,该对象的结果为数组产生的结果集。

Promise.all(
    (data || []).map(async (item) => {
      const { data } = await requestService(item.id)
	  return {
	    key: item.id,
	    title: item.name,
	    value: item.id,
	    children: data
	  }
    })
  )

5、其他函数扩展

5.1、reduce

对于reduce来说,也是基本和map差不多的思路,只是需要提前将前一次的结果用await取出Prmose的值,再进行运算。

await [1, 2, 3].reduce(async(previousValue, currentValue) => await previousValue + currentValue, 0)

// result 6
5.2、filter
await Promise.all([1, 2, 3].filter(async value => value % 2 === 1)) // [1,2,3]

async返回的Promise被直接判断成true,导致一个元素也没被过滤掉。
这里我们要使用一个临时数组配合前面map先获取异步filter对应每个元素的结果,然后再使用filter过滤数组。

const filterResults = await Promise.all([1, 2, 3]
                            .map(async value => (value % 2 === 1))); // [true,false,true]
[1, 2, 3].filter((value, index) => filterResults[index]); // [1,3]
5.3、有空再来补充吧,好饿,先去吃饭了~
在使用`map`方法中结合`async/await`时,一般的模式是使用`Promise.all`来处理返回的异步操作结果。 这种使用方法可以在一个数组中的每个元素上执行异步操作,并在所有异步操作完成后返回一个包含所有结果的新数组。 例如,在微信小程序中,可以使用以下代码示例来使用`map`结合`async/await`: ``` let videos = video.datas.map(async item => { item.id = index; item.videoUrl = await this.getVideoUrl(item.data.vid); return item; }); let temp = await Promise.all(videos); this.setData({ video: temp }); ``` 在以上代码示例中,`videos`是一个由`map`返回的包含异步操作的函数的数组。每个元素的异步操作都使用`await`关键字来等待结果。最后,使用`Promise.all`将所有异步操作包装为一个Promise对象,等待所有异步操作完成后返回一个包含所有结果的新数组。最后,使用`setData`方法将结果赋值给`video`变量。 总结来说,使用`map`结合`async/await`的一般模式是 `Promise.all(arr.map(async (...) => ...))`。 这种模式可以在循环中依次执行异步操作,并在所有异步操作完成后返回一个包含所有结果的新数组。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [async awaitmap中使用](https://blog.csdn.net/qq_46258819/article/details/125563023)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [在JS循环中使用async/await的方法](https://download.csdn.net/download/weixin_38520258/13658555)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值