Подпишитесь на заметку после http звонка.Угловой 6 - PullRequest
0 голосов
/ 25 ноября 2018

это проблема, с которой я столкнулся в Angular.Приведенный ниже метод выполняет два http-вызова.

  submit(username: string, pword: string) {
    this.loginService.signIn(username, pword);

    this.loginService.currentloginAttemp.subscribe(data => {
      if (data == true) {
        this.profileService.getProfile();    
      }
    });

    this.profileService.newProfileObj.subscribe(dataProfile =>{
      console.log(dataProfile);
    });
  }

  submit(username: string, pword: string) {
    this.loginService.signIn(username, pword);

signIn выполняет http-вызов и присваивает наблюдаемому объекту currentloginAttemp

    this.loginService.currentloginAttemp.subscribe(data => {
      if (data == true) {
        this.profileService.getProfile();    
      }
    });

Приведенный выше код работает без проблем.this.profileService.getProfile () выполняет http-вызов для получения нового профиля.Приведенный ниже код подписывается на полученный профиль.

    this.profileService.newProfileObj.subscribe(dataProfile =>{
      console.log(dataProfile);
    });
  }

Когда я делаю console.log (dataProfile);Я получаю неопределенное предупреждение.

Когда я запускаю эту функцию:

  logout() {
        this.profileService.newProfileObj.subscribe(dataProfile =>{
          console.log(dataProfile);
        });
  }

console.log (dataProfile) возвращает профиль.

Как отложить после строкикода this.profileService.getProfile () , чтобы, когда я подпишусь на профиль, мой компонент его увидел?

РЕДАКТИРОВАТЬ:

Просто чтобы было ясно.currentloginAttemp назначается, когда this.loginService.signIn выполняет HTTP-вызов.Вот почему я не уверен, почему newProfileObj имеет значение null, когда он назначен в методе this.profileService.getProfile ().

EDIT 2:

  getProfile() {
    let tempURL = this.getProfileUrl + this.currProfileId.value;
    this.http.get<Profile>(tempURL).subscribe((data) => {
      this.currProfileObj.next(data);
    });
  }

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Я думаю, что вы используете тему.Вы должны использовать BehaviorSubject вместо субъекта.Предмет не имеет значения.

Пример темы:

const subject = new Rx.Subject();
subject.next(1);
subject.subscribe(x => console.log(x));

Выход консоли будет пустым

Пример поведения субъекта:

const subject = new Rx.BehaviorSubject();
subject.next(1);
subject.subscribe(x => console.log(x));

Выход консоли: 1

BehaviorSubject может быть создан с начальным значением: new Rx.BehaviorSubject (1)

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

 this.profileService.newProfileObj.subscribe(dataProfile =>{
        if (dataProfile) {
            console.log(dataProfile);
          }   
        });
  }
0 голосов
/ 26 ноября 2018

Ваша проблема в том, что вы используете BehaviorSubject, и он излучает сразу, а также каждый раз, когда вы запускаете .next ().Смотрите документацию о том, как BehaviorSubject работает здесь .Из-за этого вам часто захочется пропустить эту первую эмиссию, потому что вы действительно заботитесь только об остальных из них.В вашем случае это будет выглядеть примерно так (в rxjs 6+):

this.profileService.newProfileObj.pipe(skip(1)).subscribe(dataProfile =>{
  console.log(dataProfile);
});
0 голосов
/ 25 ноября 2018

Это решение.Но я не уверен, что это лучшее решение.

Внутри моего компонента я создал функцию:

  async delay(ms: number) {
    return new Promise( resolve => setTimeout(resolve, ms) );
  }

После второго http-вызова я вызвал async functino сверху ^:

    (async () => { 
      // Do something before delay
      console.log('before delay')

     await this.delay(2000);
      this.profileService.newProfileObj.subscribe(dataProfile =>{
        console.log(dataProfile);
      // Do something after
      console.log('after delay')
  })();

Это сработало, хотя я не уверен, что это лучшее решение.

...