有承诺的麻烦

时间:2018-07-27 15:05:24

标签: angularjs asynchronous ionic-framework

我正在做一个离子项目,尽管我到处都阅读了很多文档,但我对沮丧的承诺和'.then()'感到有些沮丧。

这种情况是我有一个提供者,其功能为loadClientsgetWaybills。 第一个从所有拥有运单的客户那里获取,第二个从一个具体客户获取所有运单。

  loadClients() {
    return new Promise(resolve => {
      this.http.get('http://localhost/waybills?fields=descr1_sped&idUser='+ this.id)
        .map(res => res)
        .subscribe(data => {
          this.data = data.json();
          resolve(this.data);
        });
    });
  }

  // GET WAYBILLS
  getWaybills(client) {
    return new Promise(resolve => {
      this.http.get('http://localhost/waybills/?stato=0&idUser='+ this.id +'&descr1_sped='+ client)
        .map(res => res)
        .subscribe(data => {
          this.data = data.json();
          resolve(this.data);
        });
    });
  }

另一方面,在组件welcome.ts上,我有一个函数loadWaybills,该函数在视图加载时被调用并正在执行以下代码,我的想法是获取所有客户端,然后获取每个人的运单。然后,我将仅介绍已定义的内容。

问题是,在第二个.then()上,而不是在获取变量数据时,我只是未定义...我了解,如果将同步代码放在.then()内可以正确执行并处理作为承诺结果的“数据”。为什么我得到这个未定义的?

  loadWaybills() {
    //We first load the clients
    this.waybills.loadClients()
      .then(data => {
        this.waybill = data;
        var preClients = this.waybill;
        this.clients = [];
        //Here we're deleting duplicated clients and getWaybills of them)
        for (let i = 0; i < preClients.length; i++) {
          if (this.clients.indexOf(preClients[i].descr1_sped) == -1) {
            this.waybills.getWaybills(preClients[i].descr1_sped)
            .then(data => {
              **//Here we'll check if the clients has waybills or not**
              this.clientWaybills[i] = data;
              this.clients.push(preClients[i].descr1_sped)
            });
          }
        }
      });
  }

1 个答案:

答案 0 :(得分:0)

很难说,因为我们不知道API的返回含义。例如,第一个GET某处可能缺少字段,而对于第二个GET现在,它有时以未定义形式返回。如果有时它仅返回未定义,则对此的一个简单解决方案是在将值分配给变量之前检查该值是否已定义。

如果始终返回未定义且不应返回的值,请尝试调试代码,并确保值在第二个.then之前存在。