2016-07-24 3 views
1

Я делаю проверку существующего входа в начале приложения, который я хочу только один раз. Как мы отменим подписку после первого раза? Я попытался взять (1), но это, похоже, не работает.Отмена наблюдаемого после первого раза - Angular2, TypeScript, rxjs/Observable

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; 
} 
); 
+1

Не могли бы вы сообщить, что вы имеете в виду, «не работает»? На самом деле он вызывает вызов обработчика подписки более одного раза? Почему вы хотите отменить подписку? Разве это недостаточно, если наблюдаемое завершается? –

ответ

2

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

В зависимости от импорта на уровне модуля, вы можете добавить импорт для оператора в первой

import 'rxjs/add/operator/first' 

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

EDIT: добавление явного способа отменить подписку, как первоначально запрошенную 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() или на основе по событиям после init и отменить ожидающие подписки в пределах ngOnDestroy().

+1

'first()' и 'take (1)' идентичны поведению – paulpdaniels

+0

Тогда я не понимаю, что ищет OP. Я отредактирую свой ответ, чтобы конкретно указать, как отменить подписку. –

+2

Ответ о правильном и том же: http://stackoverflow.com/questions/34548924/missing-observable-methods-rxjs-5-0-0-beta-0?noredirect11&lq=1 С недавним угловым версии, необходимо указать импорт rxjs. – sathishvj