javascript - Problème avec les promesses reçues par wait dans async/await
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-05-16 13:38:44
0
2
778

En async/await, ce que wait doit recevoir est un objet de promesse, donc j'écris comme ceci :

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);
      });
  })
};

Cela ne pose aucun problème. AreaSvr.getList renvoie un objet de promesse. Maintenant, j'encapsule AreaSvr.getList et j'ajoute un cache :

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);
        }
      }

Ici, j'ai encapsulé une couche de promesse en dehors de AddressSvr.getList pour la mise en cache. À ce moment, wait reçoit la promesse renvoyée par la fonction AddressSvr.getAddressList. Cependant, la promesse renvoyée à ce moment n'est pas valide et l'erreur est directement détectée. tu s'il te plaît, dis-moi où j'ai écrit quelque chose de mal ?

曾经蜡笔没有小新
曾经蜡笔没有小新

répondre à tous(2)
我想大声告诉你

S'il est détecté directement, cela signifie qu'il n'y a pas de problème avec la méthode d'écriture. Il se peut qu'il y ait une erreur dans la partie commerciale. Vous pouvez publier les informations d'erreur et y jeter un œil

.
Ty80

J'ai utilisé AreaList[i].children.length !== 0 pour déterminer s'il y a un cache ci-dessus. Pour le moment, il n'y a pas encore d'enfants et il n'est pas défini, donc une erreur sera signalée. Ce n'est pas un problème d'utilisation d'async/await, c'est une erreur que j'ai commise.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal