替代异步/等待使用诺言

时间:2019-09-21 15:08:32

标签: javascript promise async-await

我使用地理配准系统, 我正在按纳税人名称进行搜索,作为回应,他在地图上返回了一个批次,他在数据库中发出了一个请求,如果请求是正确的,则使用async / await将其重定向到该批次,但是我不能使用它是因为在生产中babel不接受

 async buscarGeometria(entidade) {
      let entidadeAnterior = entidade;
      if (entidade && entidade.id) {
        this.LoadingManager.show();
        if (entidade && entidade.isPessoa) {
          entidade = await this.DataFactory.GET(this.URL.LOTES() + '/' + entidade.val.lotes[0].id);
          entidade.URL = this.URL.LOTES();
          entidade.box = 'BoxInformacoesCadastrais';
        }
        this.DataFactory
          .GET(entidade.URL + '/geometria/' + entidade.id)
          .then(response => {
            if (response && response.geom) {
              entidadeAnterior.isPessoa ? this.CentralizaMapaBuscasService.centralizaMapa(this.mapa, entidade.centroide)
                : this.CentralizaMapaBuscasService.centralizaMapa(this.mapa, entidade.val.centroide);
              this.select = this.CentralizaMapaBuscasService.getSelect('Lotes', this.mapa);
              this.CentralizaMapaBuscasService.criarFeatureAndSelect(response.geom, this.select)
              entidadeAnterior.isPessoa ? this.CentralizaMapaBuscasService.mostraBroadcast(entidade.box, entidade)
                : this.CentralizaMapaBuscasService.mostraBroadcast(entidade.box, entidade.val);
            }
          }).finally(() => this.LoadingManager.hide());
      }
    }

但是我无法使用async / await处理babel兼容性问题,我做出了承诺,但是没有用

  buscarGeometria(entidade) {

  let entidadeAnterior = entidade;

  if (entidade && entidade.id) {

    this.LoadingManager.show();

    if (entidade && entidade.isPessoa) {

      this.DataFactory.GET(this.URL.LOTES() + '/' + entidade.val.lotes[0].id).then((snap) => {

        entidade = snap;
        entidade.URL = this.URL.LOTES();
        entidade.box = 'BoxInformacoesCadastrais';

      });

    }

    this.DataFactory.GET(entidade.URL + '/geometria/' + entidade.id).then(response => {

      if (response && response.geom) {

        entidadeAnterior.isPessoa ? this.CentralizaMapaBuscasService.centralizaMapa(this.mapa, entidade.centroide)
          : this.CentralizaMapaBuscasService.centralizaMapa(this.mapa, entidade.val.centroide);

        this.select = this.CentralizaMapaBuscasService.getSelect('Lotes', this.mapa);

        this.CentralizaMapaBuscasService.criarFeatureAndSelect(response.geom, this.select);

        entidadeAnterior.isPessoa ? this.CentralizaMapaBuscasService.mostraBroadcast(entidade.box, entidade)
          : this.CentralizaMapaBuscasService.mostraBroadcast(entidade.box, entidade.val);

      }
    }).finally(() => this.LoadingManager.hide());
  }
}

我想知道其他方法,谢谢

1 个答案:

答案 0 :(得分:0)

您在第二次尝试中没有正确使用承诺。

此行将返回一个承诺:

this.DataFactory.GET(this.URL.LOTES() + '/' + entidade.val.lotes[0].id).then((snap) => {

    entidade = snap;
    entidade.URL = this.URL.LOTES();
    entidade.box = 'BoxInformacoesCadastrais';

  });

这意味着在下一行entidade中将没有预期值:

this.DataFactory.GET(entidade.URL + '/geometria/' + entidade.id)

您必须改为兑现承诺:

this.DataFactory.GET(this.URL.LOTES() + '/' + entidade.val.lotes[0].id).then((snap) => {

    entidade = snap;
    entidade.URL = this.URL.LOTES();
    entidade.box = 'BoxInformacoesCadastrais';
    return entidade; // Make sure you return the entidade value to make it available to the next callback
  })
 .then((entidade) => {
    return this.DataFactory.GET(entidade.URL + '/geometria/' + entidade.id);
 })
 .then((response) => {
     // Handle your response here
 });

您可能应该阅读以下内容以了解如何兑现承诺:https://javascript.info/promise-chaining

顺便说一句,您可能会考虑将功能拆分为多个较小的功能。这将使您的代码更容易阅读。