observer.complete() не возвращается немедленно

#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();