Ответ 1
На самом деле это почти то же самое, есть несколько изменений
createUser(user: any): any {
return new Observable.create(observer => {
this.ref.createUser(user, function(error, userData) {
if (error) {
observer.error(error);
console.log("Error creating user:", error);
} else {
observer.next('success');
observer.complete();
console.log('Successfully created user account with uid:', userData.uid);
}
});
})
}
И тогда вы можете suscribe
к нему (subscribe
является эквивалентом then
).
Здесь plnkr с примером использования Observables
constructor() {
this.createUser({}).subscribe(
(data) => console.log(data), // Handle if success
(error) => console.log(error)); // Handle if error
}
EventEmitter
, с другой стороны, Subject
(документация немного отличается с тех пор angular2 переместился в последнюю версию, но он все еще понятен).
_emitter = new EventEmitter();
constructor() {
// Subscribe right away so we don't miss the data!
this._emitter.toRx().subscribe((data) => console.log(data), (err) => console.log(err));
}
createUser(user: any) {
this.ref.createUser(user, function(error, userData) {
if (error) {
this._emitter.throw(error);
console.log('Error creating user:", error');
} else {
this._emitter.next(userData);
this._emitter.return(); This will dispose the subscription
console.log('Successfully created user account with uid:', userData.uid);
}
})
}
Здесь plnkr с примером использования EventEmitter.
Разница в супер коротком: Observable начинает испускать данные, когда находит подписчиков; Тема испускает информацию о том, есть ли подписчики или нет.
Примечание
В примере EventEmitter я использовал toRx()
. Это предоставляет Subject
, но его рефакторинг, и нам больше не понадобится toRx()
.
Полезные ресурсы Обновлено
RxJS In-Depth от Ben Lesh в конференции AngularConnect 2015.
Спасибо Робу Вормальду за указание на это
Вы можете увидеть беседу с Сарой Робинсон и ее демонстрационное приложение и увидеть, как он работает здесь