ионный асинхронный - не работает - PullRequest
0 голосов
/ 08 мая 2018

мой код:

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

    }

  }

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

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

У меня нет возможности попробовать ваш код или мой, но здесь, посмотрите на этот, который должен работать в теории.

Суть в том, что вы должны решить, использовать ли Observable s или обещания. К сожалению, команда Angular решила вернуть Observable s в свой модуль http. Наблюдаемые не работают с 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]);    
    }
}
0 голосов
/ 08 мая 2018

Поскольку вы подписываетесь в Observable, вы не используете подход async / await. Async / await работает только с Обещаниями, поэтому вам нужно сначала преобразовать наблюдаемое в обещание.

Я не знаю, как работает ваш this.api, но, возможно, у вас должна быть функция toPromise (). Используя await, вам не нужно подписываться или использовать функцию обещания ".then ()".

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