#angular
#angular
Вопрос:
Возможно, я упускаю суть, но у меня создалось впечатление, что observer.complete() завершит observer, т.Е. Операторы после observer.complete() не выполняются с момента его завершения.
export class RecordsService {
public getRecords(): Observable<any> {
let vm = this;
return new Observable(observer => {
var records = vm.http.get(
url).subscribe(data =>{
console.log('we got data ', data);
observer.next(data)
observer.complete();
});
observer.next(null);
observer.complete();
});
}
}
Я могу правильно видеть консоль, но подписчик получает данные и null. Как я могу это сделать? Я ожидал получить данные через observer.next(data), а observer.next(null) не будет выполнен, поскольку я ранее вызывал observer.complete() .
Теперь я сначала получаю данные, а затем null, чего я не ожидал
Комментарии:
1. какого поведения вы ожидаете? и что
observer
это?2. @alt255 возможно, я неправильно понял объяснение, но observer.next(data); observer.complete() из-за отсутствия лучшего слова остановил бы дальнейшее выполнение. Я не ожидал, что null будет возвращен после вызова observer.complete() .
Ответ №1:
Никакие другие значения не будут выдаваться наблюдателем после его завершения.
https://stackblitz.com/edit/typescript-4cc25g
import { Observable } from 'rxjs';
const hello = Observable.create(function(observer) {
observer.next('Hello');
observer.complete();
observer.next('World');
});
const subscribe = hello.subscribe(val => console.log(val));
Вы можете видеть, как это продемонстрировано в примере stackblitx.
Я ожидал получить данные через observer.next(data), а observer.next(null) не будет выполнен, поскольку я ранее вызывал observer.complete() .
observer.next(null)
вызывается первым, а асинхронные HTTP-вызовы observer.next(data)
позже, но observer уже завершен.
Комментарии:
1. спасибо @cgTag . Глядя на мой код, что мне нужно сделать, чтобы иметь значение null для отправки позже, только если данные не были отправлены?
2. @NieSelam это зависит от того, как данные не были отправлены. Это результат ошибки HTTP или HTTP-ответ не содержит данных?
3. @Reactgular можем ли мы завершить, не выдавая никакого значения.далее я вижу много мест в моем репозитории кода, которые takeUntill(this.destroyed$) this.destroyed$.next(true); this.destroyed$.complete();