Вложенные угловые подписки не работают - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть 3 подписки, на которые нужно подписаться. Но когда я запускаю его, только 1 или 2 из них запускаются из 3. Я даже пытался поменять порядок подписок, а последняя все еще не срабатывает. Я также попытался запустить их в constructor моего углового компонента и в ngOnInit(). Я получаю тот же ответ.

Попытка 1:

this.n.authorizations.subscribe(x => {
    alert("1"); // ✅
    this.n.pages.subscribe(y => {
        alert("2"); // ❌
        this.n.user.subscribe(user => {
            alert("3"); // ❌
        });
    });
});

Попытка 2:

this.n.pages.subscribe(y => {
    alert("1"); // ✅
    this.n.authorizations.subscribe(x => {
        alert("2"); // ✅
        this.n.user.subscribe(user => {
            alert("3"); // ❌
        });
    });
});

Попытка 3:

this.n.user.subscribe(user => {
    alert("1"); // ✅
    this.n.authorizations.subscribe(x => {
        alert("2"); // ✅
        this.n.pages.subscribe(y => {
            alert("3"); // ❌
        });
    });
});

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

Ответы [ 3 ]

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

Я понял проблему (вид). С первой попытки подписка на pages произошла после разрешения наблюдаемой pages. Поэтому я изменил объект возврата в этой сервисной функции на ReplaySubject вместо Subject, что заставляет поздних подписчиков получать самое последнее значение. Я не знаю, как все это произошло, но это решило мою проблему. Хотя это не имеет смысла.

Редактировать: как предложил другой пользователь, в этом случае было бы лучше BehaviorSubject.

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

Мне кажется, что вы цепляете вещи, которые не должны быть связаны.

this.n.user.subscribe(user => {
    alert("1");
});
this.n.authorizations.subscribe(x => {
    alert("2");
});
this.n.pages.subscribe(y => {
    alert("3");
});

Когда вы подписываетесь, как вы, ваши внутренние подписки даже не присоединяются , пока ваши внешние подписки не получат свое первое значение.

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

Судя по подходам, которые вы используете, похоже, что любая подписка не зависит от других подписок.

Так что в таком случае, почему бы не forkJoin их, а затем subscribe к объединенной наблюдаемой.

import { forkJoin } from 'rxjs';
...
const combined = forkJoin(
  this.n.user,
  this.n.authorizations,
  this.n.pages
);
...
combined.subscribe(
  [user, auths, pages] => console.log(user, auths, pages),
  error => console.log(error),
  () => console.log('Combined Completed')
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...