Гарантирование ответа от наблюдаемого перед выполнением следующей строки - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь дождаться вызова API из наблюдаемой, прежде чем перейти к следующей строке кода / функции.Я не могу сделать это, однако обещание работает с await.Вот мой код:

 async validateDataObservable(email: string) {
    await this.userProfileService.getUserByEmail().subscribe((val: any) => {
      console.log('Hello');
    });
    console.log('Execute after Hello');

    // Output:
    // Execute after Hello
    // Hello
  }

К сожалению, это не желаемое поведение вывода.

Код ниже работает, но мне нужны те же функции для Observables из-за требования.

  async validateDataPromise(email: string) {
    await this.userProfileService.getUserByEmailPro(email).then((val: any) => {
      console.log('Hello');
    });
    console.log('Execute after Hello');

    // Output:
    // Hello
    // Execute after Hello
  }

Любая помощь приветствуется.Спасибо

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Вы не можете этого сделать.Получите оставшуюся часть кода (код, который вы хотите выполнить после console.log ('hello')) в функцию. И вызовите функцию внутри подписки после вызова console.log ('hello').Или вы можете просто поместить остаток кода в подписку после console.log ('hello).

async validateDataPromise(email: string) {
    await this.userProfileService.getUserByEmailPro(email).then((val: any) => {
      console.log('Hello');
      this.doRest()
    });


    // Output:
    // Hello
    // Execute after Hello
  }

doRest(){
  console.log('Execute after Hello');
 // implement what you want after asynchronous call.
}
0 голосов
/ 04 октября 2018

Вы можете использовать Behavior / Asyn Subject и написать код полностью.Примерно так:

validateDataPromise(email: string) {
  this.userProfileService.getUserByEmailPro(email)
  .takeUntil(this.unSub)
  .subscribe((val: any) => {
    console.log('Hello');
  }, (error: Error) => {
    console.error('Error');
  }, () => {
    console.log('Execute after Hello');
  });
}

Рекомендации: https://medium.com/@luukgruijs/understanding-rxjs-behaviorsubject-replaysubject-and-asyncsubject-8cc061f1cfc0

http://reactivex.io/rxjs/manual/overview.html#asyncsubject

0 голосов
/ 04 октября 2018

await - это функция Promise, поэтому, к сожалению, вы не можете сделать это с помощью Observables.Вы можете использовать .toPromise(), если вы действительно хотите эту функцию, но это не рекомендуется.Вы должны поместить свой код внутри subscribe тела (или внутри map).

...