Три обещания с HTTP - PullRequest
       11

Три обещания с HTTP

0 голосов
/ 19 сентября 2018

Мне пришлось сделать три HTTP-запроса в моем коде.Первые два работают, я отлаживаю код, и они возвращают правильное значение, но последний возвращает неопределенное.Я сделал эти три запроса из-за одного в зависимости от ответа другого.

кнопка входа в систему:

goToMenu() {
this.dados_login = [];
this.dados_login.push({
  "CPF": this.cpfLogin,
  "Senha": this.senhaLogin
})
let headers = new Headers();
headers.append('Content-Type', 'application/json; charset=UTF-8');
let options = new RequestOptions({ headers: headers });

return new Promise((resolve, reject) => {
  this.http.post(this.url, JSON.stringify(this.dados_login["0"]), options)
    .toPromise()
    .then((response) => {
      var json_token = (response as any)._body;
      var parsed = JSON.parse(json_token);

      var arr = [];

      for (var x in parsed) {
        arr.push(parsed[x]);
      }

      this.token = arr[0];

      this.carregaEmpresas();
    })
    .catch((error) => {
      var json_error = (error as any)._body;
      var parsed = JSON.parse(json_error);

      var arr = [];

      for (var x in parsed) {
        arr.push(parsed[x]);
      }

      this.error_login = arr[0];

      this.presentAlert(this.error_login)
    });
});

функция, которая переносит компании, здесь возникает ошибка, потому что ей ничего не возвращаетсяit

carregaEmpresas(newpage: boolean = false) {
console.log(this.cpfLogin);
this.abreCarregando();

return new Promise((resolve, reject) => {
  this.EmpresaProvider.getEmpresas(this.token, this.cpfLogin)
    .then((response) => {
      var json_emp = (response as any)._body;
      var parsed = JSON.parse(json_emp);

      var arr_emp = [];

      for (var x in parsed) {
        arr_emp.push(parsed[x]);
      }

      this.lista_empresas = arr_emp;

      this.objEmp = [];
      for (let i = 0; i < this.lista_empresas.length; i++) {
        this.obj = {
          label:
            this.lista_empresas[i].Valor,
          type: 'radio',
          value: this.lista_empresas[i].Chave
        }
        this.objEmp.push(this.obj);
      }

      this.fechaCarregando();
      this.selectEmpresa();
    })
    .catch((error) => {
      var json_error = (error as any)._body;
      var parsed = JSON.parse(json_error);

      var arr = [];

      for (var x in parsed) {
        arr.push(parsed[x]);
      }

      this.error_login = arr[0];

      this.presentAlert(this.error_login)
    });
});

роль поставщика:

return new Promise((resolve, reject) => {
  this.http.post(this.baseApiPath, JSON.stringify(this.cpf_usuario["0"]), options)
    .toPromise()
    .then((response) => {
      var empresa = (response as any)._body;
      var parsed = JSON.parse(empresa);

      var arr = [];

      for (var x in parsed) {
        arr.push(parsed[x]);
      }

      this.empresa_cod = arr[0].Chave.split("/", 1);
      var urlFilial = this.apiFilial + this.empresa_cod["0"];
      return this.http.get(urlFilial, options);
    })
    .catch((error) => {
      var json_error = (error as any)._body;
      var parsed = JSON.parse(json_error);

      var arr = [];

      for (var x in parsed) {
        arr.push(parsed[x]);
      }

      return arr[0];
    });
});

GetEmpresas Код:

getEmpresas(token: string, Cpf: string) {
    let headers = new Headers();
    headers.append('Content-Type', 'application/json; charset=UTF-8');
    headers.append('Authorization', 'bearer ' + token);
    let options = new RequestOptions({ headers: headers });
    this.cpf_usuario.push({ "Cpf": Cpf });

    return new Promise(resolve => {
      window.setTimeout(() => {
        this.http.post(this.baseApiPath, JSON.stringify(this.cpf_usuario["0"]), options)
          .toPromise()
          .then((response) => {
            var empresa = (response as any)._body;
            var parsed = JSON.parse(empresa);

            var arr = [];

            for (var x in parsed) {
              arr.push(parsed[x]);
            }

            this.empresa_cod = arr[0].Chave.split("/", 1);
            var urlFilial = this.apiFilial + this.empresa_cod["0"];
            return this.http.get(urlFilial, options)
              .toPromise()
              .then((response) => {
                var json_emp = (response as any)._body;
                var parsed = JSON.parse(json_emp);

                var arr_emp = [];

                for (var x in parsed) {
                  arr_emp.push(parsed[x]);
                }

                this.emp = arr_emp;
                return arr_emp;
              })
          })
          .catch((error) => {
            var json_error = (error as any)._body;
            var parsed = JSON.parse(json_error);

            var arr = [];

            for (var x in parsed) {
              arr.push(parsed[x]);
            }

            return arr[0];
          });
      }, 2000);
    });
  }

1 Ответ

0 голосов
/ 24 сентября 2018

Это черновик, потому что я не уверен, что обнаружил проблему, но мне нужно предоставить больше кода, чем уместится в комментарии.

Первое, что я бы попробовал, - это удалитьnew Promise потому что вы все равно не решаете и не отклоняете эти обещания.Я также попытался бы удалить window.setTimeout.В этот момент похоже, что getEmpresas вернет обещание для arr_emp, которое является результатом анализа окончательного ответа get.Если вы сделаете это, то обработчик then в carregaEmpresas получит arr_emp, который был сгенерирован в getEmpresas, поэтому вы должны просто назвать параметр arr_emp и не пытаться его проанализировать снова.Код на этом этапе:

class MyClass {
    // Dummy declarations to suppress TypeScript errors
    dados_login;
    cpfLogin;
    senhaLogin;
    http;
    url;
    token;
    error_login;
    presentAlert;
    abreCarregando;
    lista_empresas;
    objEmp;
    obj;
    fechaCarregando;
    selectEmpresa;

    EmpresaProvider: EmpresaProvider;

    goToMenu() {
        this.dados_login = [];
        this.dados_login.push({
          "CPF": this.cpfLogin,
          "Senha": this.senhaLogin
        })
        let headers = new Headers();
        headers.append('Content-Type', 'application/json; charset=UTF-8');
        let options = new RequestOptions({ headers: headers });

          this.http.post(this.url, JSON.stringify(this.dados_login["0"]), options)
            .toPromise()
            .then((response) => {
              var json_token = (response as any)._body;
              var parsed = JSON.parse(json_token);

              var arr = [];

              for (var x in parsed) {
                arr.push(parsed[x]);
              }

              this.token = arr[0];

              this.carregaEmpresas();
            })
            .catch((error) => {
              var json_error = (error as any)._body;
              var parsed = JSON.parse(json_error);

              var arr = [];

              for (var x in parsed) {
                arr.push(parsed[x]);
              }

              this.error_login = arr[0];

              this.presentAlert(this.error_login)
            });
    }

    carregaEmpresas(newpage: boolean = false) {
        console.log(this.cpfLogin);
        this.abreCarregando();

          this.EmpresaProvider.getEmpresas(this.token, this.cpfLogin)
            .then((/*response*/ arr_emp) => {
              /*
              var json_emp = (response as any)._body;
              var parsed = JSON.parse(json_emp);

              var arr_emp = [];

              for (var x in parsed) {
                arr_emp.push(parsed[x]);
              }
              */

              this.lista_empresas = arr_emp;

              this.objEmp = [];
              for (let i = 0; i < this.lista_empresas.length; i++) {
                this.obj = {
                  label:
                    this.lista_empresas[i].Valor,
                  type: 'radio',
                  value: this.lista_empresas[i].Chave
                }
                this.objEmp.push(this.obj);
              }

              this.fechaCarregando();
              this.selectEmpresa();
            })
            .catch((error) => {
              var json_error = (error as any)._body;
              var parsed = JSON.parse(json_error);

              var arr = [];

              for (var x in parsed) {
                arr.push(parsed[x]);
              }

              this.error_login = arr[0];

              this.presentAlert(this.error_login)
            });
    }
}

class EmpresaProvider {
    // Dummy declarations to suppress TypeScript errors
    cpf_usuario;
    http;
    baseApiPath;
    empresa_cod;
    apiFilial;
    emp;

    getEmpresas(token: string, Cpf: string) {
        let headers = new Headers();
        headers.append('Content-Type', 'application/json; charset=UTF-8');
        headers.append('Authorization', 'bearer ' + token);
        let options = new RequestOptions({ headers: headers });
        this.cpf_usuario.push({ "Cpf": Cpf });

            return this.http.post(this.baseApiPath, JSON.stringify(this.cpf_usuario["0"]), options)
              .toPromise()
              .then((response) => {
                var empresa = (response as any)._body;
                var parsed = JSON.parse(empresa);

                var arr = [];

                for (var x in parsed) {
                  arr.push(parsed[x]);
                }

                this.empresa_cod = arr[0].Chave.split("/", 1);
                var urlFilial = this.apiFilial + this.empresa_cod["0"];
                return this.http.get(urlFilial, options)
                  .toPromise()
                  .then((response) => {
                    var json_emp = (response as any)._body;
                    var parsed = JSON.parse(json_emp);

                    var arr_emp = [];

                    for (var x in parsed) {
                      arr_emp.push(parsed[x]);
                    }

                    this.emp = arr_emp;
                    return arr_emp;
                  })
              })
              .catch((error) => {
                var json_error = (error as any)._body;
                var parsed = JSON.parse(json_error);

                var arr = [];

                for (var x in parsed) {
                  arr.push(parsed[x]);
                }

                return arr[0];
              });

      }
}

Пожалуйста, попробуйте этот код (конечно, встроенный в вашу оригинальную программу) и дайте мне знать, если он работает или нет, какова точная ошибка и в какой строке она происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...