首頁  >  問答  >  主體

javascript - async/await 中await接收的promise的問題

在async/await中,await接收的需要是一個promise對象,那麼我這樣寫:

async getAddressList () {
        this.list = await AreaSvr.getList(320100);
      }

getAddressList().catch((err) => {
    ...
  });
AddressSvr.getList = function (pid) {
  return new Promise((resolve, reject) => {
    Vue._http.get('area/get', {pId: pid}).then(
      res => {
        resolve(res.Data);
      }, err => {
        reject(err);
      });
  })
};

這樣是沒有問題的,AreaSvr.getList中回傳的是一個promise物件。現在我把AreaSvr.getList封裝一下,加一個快取:

let areaList = [];

AddressSvr.getAreaList = (level, pid) => {
// 接收等级跟pid两个参数,如果已有areaList或者相关二级list,直接返回Promise.resolve(...) 

  if (level === 1 && areaList.length !== 0) {
    return Promise.resolve(areaList)
  } else if (level === 2) {
    for (let i = 0; i < areaList.length; i++) {
      if (areaList[i].AreaId === pid && areaList[i].children.length !== 0) {
        return Promise.resolve(areaList[i].children)
      }
    }
  }
  
  // 这里对之前的http请求AddressSvr.getList进行封装,在获取到相关值之后,进行缓存并且返回
  
  return new Promise(// 返回一个promise对象,让await来接收
    (resolve, reject) => {
      AddressSvr.getList(pid).then(
        res => {
          if (level === 1) {
            areaList = res;// 缓存areaList 
            return resolve(areaList); //返回
          }
          for (let i = 0; i < areaList.length; i++) {
            if (areaList[i].AreaId === pid) {
              areaList[i].children = res;// 缓存子列表
              return resolve(areaList[i].children);// 返回
            }
          }
        }, err => {
          reject(err);
        }
      );
    }
  );
};
      
 async getAddressList () {
        this.list = await AreaSvr.getAreaList(1, 320100);//这里传入等级,使用加了缓存的函数
        if (this.list.length !== 0) {
          this.childList = await AreaSvr.getAreaList(2, this.list[0].AreaId);
        }
      }

在這裡,我在AddressSvr.getList的外面封裝了一層promise做了緩存,這時候await接收的是AddressSvr.getAddressList 這個函數返回的promise了,但是這個時候返回的promise無效,直接catch到error了,請問一下我哪邊寫的有問題?

曾经蜡笔没有小新曾经蜡笔没有小新2713 天前742

全部回覆(2)我來回復

  • 我想大声告诉你

    我想大声告诉你2017-05-16 13:40:44

    如果直接catch了,表示寫法沒有問題,可能是業務部分出錯了,可以把error資訊貼出來看看

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-16 13:40:44

    我在上面判斷是否有快取的地方用的是areaList[i].children.length !== 0,這個時候還沒有children,是undefind,所以會報錯。這不是async/await的用法問題,是我自己寫錯了。

    回覆
    0
  • 取消回覆