Код продолжает выполняться без ожидания - PullRequest
0 голосов
/ 02 марта 2020

У меня есть такая структура:

export class SomeDerived extends SomeBase implements OnInit{
    public async ngOnInit(): Promise<void> {
        await super.ngOnInit();
        this.getBy(this.x);
    } 
}

export class SomeBase implements OnInit {
    public x: any;
    public async ngOnInit(): Promise<void> {
        try{
            await this.fetch();
        }catch(e){}
    }

    public async fetch(): Promise<void> {
        const someId = await this.requestService.fetchId().toPromise().id;
       this.x = await this.requestService.fetchX(someId).toPromise();
    }
}

хорошо, когда я запускаю это, this.x в SomeDerived не определено, потому что он не ожидает результатов super.ngOnInit (), которые будут установлены в SomeBase и это продолжается. Я не очень хорошо разбираюсь в асинхронном коде, не могли бы вы помочь мне понять, почему это происходит?

Ответы [ 2 ]

1 голос
/ 02 марта 2020
 public async fetch(): Promise<void> {
   return new Promise( async (resolve, reject) => {
      const someId = await this.requestService.fetchId().toPromise().id;
      this.x = await this.requestService.fetchX(someId).toPromise();
      resolve();
   });
 }

Вам необходимо вернуть Promise, иначе вы не сможете использовать await

0 голосов
/ 02 марта 2020

Я бы создал базовый компонент, который реализует метод ngOnInit. В этом базовом компоненте вы создаете другой метод (например, onComponentCreated), который вызывается после того, как был выполнен метод asyn c. Тогда ваш производный класс не реализует OnInit, но он реализует ваш базовый класс и, следовательно, выполняет onComponentCreated.

export class SomeDerived extends SomeBase {
      ................
      public onComponentCreated(): Promise<void> {
         ........
         this.getBy(this.x);
         ........
      } 
    }

 export class SomeBase implements OnInit {
     public x: any;
     ........
     public ngOnInit() {
       ........
       this.fetch().subscribe(result => {
          this.x = result;
          this.onComponentCreated();
       });
     }

    public abstract onComponentCreated();


    public async fetch(): Observable<void> {
        return new Observable(observer => {       
           const someId = await this.requestService.fetchId().toPromise().id;
           const result = await this.requestService.fetchX(someId).toPromise();
           observer.next(result)
       });
     }
    }
...