vue await async 一个列表循环获取详情
需求: 获取列表的同时获取每个列表的详情
1,获取到一个商品列表
2,但是商品列表里面没有商品详情信息
3,根据商品列表里的商品id循环列表,获取对应的列表内商品的详情
问题: 循环获取详情的时候出现异步,导致没有及时的获取商品详情信息
解决方法: async await 异步变同步,
具体:
1 1>获取详情的方法 2 const getOrderInfoFn = (id) => { 3 4 let p = new Promise((resolve,reject)=>{ 5 $http.get('请求的接口'+id,{},).then(res=>{ 6 let datas = res.data.data 7 resolve(datas) 8 }) 9 }) 10 return p 11 } 12 13 // 详情使用promise 返回请求到的值 14 15 2>获取列表的方法 16 const getOrderListFn = async () => { 17 18 let params = { 19 page:state.page, 20 limit:state.curPageLen, 21 } 22 await $http.get('请求的接口',params).then(async res=>{ 23 24 let curPageData = res.data.data.rows 25 state.totalSize = res.data.data.total; 26 27 //异步转同步,调用同步数据合并方法(在下面) 28 curPageData = await fdata(curPageData) 29 30 if(state.page ==1 ){ 31 state.curPageData = [] 32 } 33 state.curPageData =[...state.curPageData,...curPageData] 34 state.page += 1 35 }).catch(err=>{ 36 console.log(err) 37 38 }) 39 } 40 41 42 43 44 45 3>同步数据合并方法 46 const fdata = async (data) =>{ 47 48 //map 出一个循环的promise数组,使用promise.all在继续后面 49 const promises = data.map(async item => { 50 const listItem = await getOrderInfoFn(item.id).then(infos=>infos) 51 // const listItem = await {goods:[{goods_name:'ceshi'}]} 52 return listItem; 53 }); 54 55 // 使用promise.all 拿到所有的商品详情 56 const listItems = await Promise.all(promises) 57 // 将商品详情合并入商品的列表信息(promise.all 返回的信息是按照列表的顺序来的,所以可以使用下标进行匹配) 58 const nres = data.map((item,index)=>({ 59 ...item, 60 ...listItems[index] 61 })) 62 return nres 63 } 64 65 66
忍一时,越想越气;
退一步,哎呦我去!