В чем разница между новым наблюдаемым и в RXJS - PullRequest
0 голосов
/ 20 сентября 2018

В чем разница между new Observable() и of() в RxJs?

В моих тестовых случаях, когда я пытаюсь вернуть new Observable(), выдается ошибка, связанная с проводной связью, и если я заменяю ее наof() из Rxjs работает нормально.

У меня сложилось впечатление, что Observable.create(), new Observable() и of() делает то же самое.

someService.getMethod().pipe(
  ...
  catchError((e) => {
    // some operation
    // return new Observable(false as any);  // ----> creates error
    return of(false as any); // this works perfectly
  })
)

1 Ответ

0 голосов
/ 20 сентября 2018

Observable.create() и new Observable() по сути делают то же самое.

Из анатомии наблюдаемой :

Rx.Observable.create - псевдоним для Observable constructor, и этопринимает один аргумент: функция subscribe.

Observable.of, с другой стороны, это метод static для Observable.Он создает для вас Observable, который выдает значения, которые вы указываете в качестве аргумента (ов) сразу один за другим, а затем отправляет полное уведомление.

Проблема с вашей реализацией:

Ваша реализация Custom Observable неверна.Когда вы new создаете Observable, вы должны передать функцию subscribe ее constructor, которая имеет observer в качестве аргумента.У этого observer есть такие методы, как next, error и complete, которые вызываются в тех конкретных экземплярах в жизненном цикле этой наблюдаемой.

Вы также должны выставить объект Subscriptionу него есть метод unsubscribe, который затем может быть использован потребителем для выполнения любой очистки.

Вот как это можно реализовать в целом:

const yourCustomObservable = new Observable((observer) => {
  observer.next("This pushes new value to the consumer");
  observer.error("This pushes an error to the consumer");
  observer.complete();

  return function unsubscribe() {
    // When the consumer unsubscribes, clean up data ready for next subscription.
  };
});

Для вашего конкретного случая использования вы можете использовать:

new Observable(...):

import { Observable } from 'rxjs';
...
someService.getMethod().pipe(
  ...
  catchError((e) => {
    // some operation
    return new Observable(observer => observer.next(false));
  })
)

Observable.create:

import { Observable } from 'rxjs';
...
someService.getMethod().pipe(
  ...
  catchError((e) => {
    // some operation
    return Observable.create(observer => observer.next(false));
  })
)

of:

import { of } from 'rxjs';
...
someService.getMethod().pipe(
  ...
  catchError((e) => {
    // some operation
    return of(false);
  })
)

from:

import { from } from 'rxjs';
...
someService.getMethod().pipe(
  ...
  catchError((e) => {
    // some operation
    return from([false]);
  })
)

Естьпосмотрите на это Образец StackBlitz для ссылки

Когда использовать что?

new Observable(...) или Observable.create(...)дает вам более точный контроль зерна, где вы можете определить свою собственную функцию subscribe и делать с ней все, что захотите.Поэтому вы можете захотеть использовать его для реализации пользовательских Observable, которые обычно нельзя создать с помощью методов static, предоставленных в Observable.Однако для простых случаев использования, подобных вашему, достаточно использовать Observable.of или Observable.from.

...