Отменить наблюдаемое после первого раза - Angular2, TypeScript, rxjs/Observable

Я проверяю существующий логин при запуске приложения, что мне нужно только один раз. Как нам отменить эту подписку после первого раза? Я пробовал взять (1), но это не работает.

this.auth.getUserData().take(1).subscribe(data => { // the take(1) doesn't work
  console.log('Firebase responded with success.');
  this.rootPage = TabsPage;
 }, err => {
  console.log('Firebase responded with error.', err);
  this.rootPage = LoginEmailPage;
 }
);

person sathishvj    schedule 24.07.2016    source источник
comment
Не могли бы вы посоветовать, что вы имеете в виду под не работает? Действительно ли он вызывает ваш обработчик подписки более одного раза? Почему вы хотите отменить подписку? Разве этого недостаточно, если наблюдаемое завершается?   -  person Ben Dadsetan    schedule 28.07.2016


Ответы (1)


Вы пробовали first() вместо take(1)

В зависимости от вашего импорта на уровне модуля вы можете добавить импорт для оператора first.

import 'rxjs/add/operator/first'

Хотя на самом деле это не отменяет подписку, это завершает наблюдение, что, как я полагаю, и имелось в виду.

РЕДАКТИРОВАТЬ: добавление явного способа отмены подписки, как это было первоначально запрошено OP

Результат .subscribe(...) вернет обработчик подписки. Вы можете использовать этот дескриптор, чтобы явно отменить подписку, и код будет выглядеть так:

let subscription = this.auth.getUserData().take(1).subscribe(data => { // the take(1) doesn't work
  console.log('Firebase responded with success.');
  this.rootPage = TabsPage;
  subscription.unsubscribe();
 }, err => {
  console.log('Firebase responded with error.', err);
  this.rootPage = LoginEmailPage;
 }
);

Хотя явно отменять подписку в этом случае кажется неправильным, распространенным шаблоном является создание подписки в ngOnInit() или на основе событий post init и отмена ожидающих подписок в ngOnDestroy().

person Ben Dadsetan    schedule 26.07.2016
comment
first() и take(1) — идентичное поведение - person paulpdaniels; 28.07.2016
comment
Тогда я не понимаю, что ищет ОП. Я отредактирую свой ответ, чтобы конкретно указать, как отменить подписку. - person Ben Dadsetan; 28.07.2016
comment
Ответ примерно правильный и такой же, как: stackoverflow.com/questions/34548924/ В последней версии angular необходимо указать импорт rxjs. - person sathishvj; 28.07.2016