asyncawit 配合permise实现异步出了问题?

methods: {
    getData() {
      if(!this.token) {
        console.log('token is null')
        return
      }
      let tokenBody = {
        "Content-Type": "application/json",
      }
      let itemsArr = []
      this.bymbolArr.forEach(async item => {
        console.log(item)
        let tokenBody = {
          'Content-Type': 'application/json',
        }
        let data = await post(Config.getSharesUrl, tokenBody);
        if (data.RetrieveItem_Response_3) {
          let dataArr = data.RetrieveItem_Response_3.ItemResponse[0].Item[0].Fields.Field;
          if(dataArr.length > 0) {
            var obj = {}
            let arr = dataArr.forEach( item => {
              if(item.Double) {
                obj[item.Name] = item.Double
              }
            })
          }
        }
        let itemObj = {}
        itemObj[item] = obj
        console.log('itemibj='itemObj)
        itemsArr.push(itemObj)
      })
      console.log('itemsArr=' + itemsArr)
      this.items = itemsArr
    }

await 后边的post是自己用permise封装的ajax,配合async和await使用,结果先显示itemsArr= 空,再显示itemibj=的每项,是什么原因造成的?

阅读 2.4k
3 个回答

不要在async await的时候有forEach或者其他封装的方法
可以用原始的for循环或for of
或者类似于这样的封装

let each = async (arr,fn) => {
  for(var i=0;i<arr.length;i++){
    await fn(arr[i],i);
  }
}

async getData(){
  let itemsArr = [];
    await each([1, 2, 3], async item => {
        var data = await post(item);
        itemsArr.push(data);
    });
    console.log(itemsArr)
}

首先没理解你描述的问题哈,不过看了下代码,forEach中使用async/await,相当于每个await是独立在不同的async function中的,所以相互不会等待。你可以async getData()然后使用for循环代替forEach。

因为外层函数不是异步,你仔细体会一下。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题