今天需要在成图前从数据库依次获取各点的数据,结果发现直接用数组的forEach
和map
都无效。
代码如下:
//服务器异步方法总是最后? configEchart=async()=>{ const {stations} = this.state let options = [] await stations.map(async(item,index)=>{ console.log(item,index) await WorkSiteApi.getMeasuringData(item.measuringPointId).then((res)=>{ console.log(res) options.push( { type: 'line', data: res.data } ) }) }) console.log('options',options) await this.setState({options:options}) }
调试台输出结果如下:
从输出结果来看,map和forEach会并发执行里面的await异步函数,也就是说会把同步任务先执行完,然后再去执行任务队列里的异步任务。
解决方法就是用for函数
:
configEchart=async()=>{ const {stations} = this.state let options = [] for(let item of stations){ let res = await WorkSiteApi.getMeasuringData(item.measuringPointId) options.push( { type: 'line', data: res.data } ) } console.log('options',options)
数据正常获取:
或者换一种写法。应用promise.all将所有异步一起执行
let promises = stations.map(async(item)=>{ await WorkSiteApi.getMeasuringData(item.measuringPointId).then((res)=>{ options.push( { type: 'line', data: res.data.map(i=>i.accDeformationZ) } ) }) }) await Promise.all(promises) console.log('options',options)
输出效果一样