【问题标题】:ionic Async-await not working离子异步等待不起作用
【发布时间】:2018-05-09 00:59:49
【问题描述】:

我的代码是:

async getDetails(){
  for(var i=0;i<this.results.length;i++){
      // this.booking.length=0;
      // this.hbl.length=0;
      var hblList=[];
      var bookingList=[];
      await this.api.get("track/dtl", 
      {
       loadPortId: this.results[i].loadPortId,
        dischargeId:this.results[i].dischargeId,
        scheduleId: this.results[i].scheduleId
      })
      .subscribe(res1 => {
        //let resp1 = res1;
        this.details= res1;
        bookingList.length=0;
        hblList.length=0;
        for(var j=0;j<this.details.length;j++){
          if(this.details[j].bookNo!== undefined){ 
            bookingList.push(this.details[j]);
           }else if(this.details[j].hblNo!== undefined){
            hblList.push(this.details[j]);
           }
         }
        //  this.results[i]["hbl"]=this.hbl;
        //   this.results[i]["booking"]=this.booking;
         console.log("this.hbl inside subscribe::::::::::::"+hblList);
        console.log("this.booking  inside subscribe::::::::::::"+bookingList);
        console.log("this.results[i]  after::::::::::::"+this.results[i]);
        });

        this.results[i]["hbl"]=hblList;
        this.results[i]["booking"]=bookingList;
        console.log("this.hbl after::::::::::::"+hblList);
        console.log("this.booking  after::::::::::::"+bookingList);
        console.log("this.results[i]  after::::::::::::"+this.results[i]);
        this.getCurrent(this.results[i].queries[0]);

    }

  }

我想为每个 for 循环项目进行异步调用。谁能帮我使用 async-await 来确保第一个和每个异步调用在下一次调用之前完成。 提前致谢

【问题讨论】:

    标签: angularjs ionic-framework


    【解决方案1】:

    当您订阅 Observable 时,您没有使用 async/await 方法。 Async/await 仅适用于 Promises,因此,您需要先将 observable 转换为 Promise。

    我不知道你的 this.api 是如何工作的,但是,也许你应该有一个 toPromise() 函数。使用 await 你不需要订阅或使用“.then()”promise 函数。

    【讨论】:

      【解决方案2】:

      我无法尝试您的代码或尝试我的代码,但在这里,看看这个理论上应该可行的代码。

      重点是:你必须决定是使用Observables 还是使用Promises。不幸的是,Angular 团队决定在他们的http 模块中返回Observables。 Observables 不适用于async await,但有一个简单的转换:Observable.prototype.toPromise()。使用它,然后摆脱.subscribe

      async getDetails(){
          for(var i=0;i<this.results.length;i++){
              // this.booking.length=0;
              // this.hbl.length=0;
              var hblList=[];
              var bookingList=[];
              var res1 = await this.api.get("track/dtl", {
                  loadPortId: this.results[i].loadPortId,
                  dischargeId:this.results[i].dischargeId,
                  scheduleId: this.results[i].scheduleId
              }).toPromise();
      
              this.details= res1;
              bookingList.length=0;
              hblList.length=0;
              for(var j=0;j<this.details.length;j++){
                  if(this.details[j].bookNo!== undefined){ 
                      bookingList.push(this.details[j]);
                  } else if(this.details[j].hblNo!== undefined){
                      hblList.push(this.details[j]);
                  }
              }
      
              this.results[i]["hbl"] = hblList;
              this.results[i]["booking"] = bookingList;
              console.log("this.hbl after::::::::::::"+hblList);
              console.log("this.booking  after::::::::::::"+bookingList);
              console.log("this.results[i]  after::::::::::::"+this.results[i]);
              this.getCurrent(this.results[i].queries[0]);    
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        • 1970-01-01
        相关资源
        最近更新 更多