Пользовательский оператор RxJS не вызывает завершения - PullRequest
3 голосов
/ 17 июня 2019

У меня есть следующий пользовательский оператор:

export function test() {
  return function(source) {
    return new Observable(observer => {

      return source.subscribe({
        next(value) {
          observer.next(value);
        },
        error(error) {
          observer.error(error);
        },
        complete() {
          console.log('completed')
          observer.complete();
        }
      })
    });
  }
}

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

interval(1000).pipe(
  test(),
  take(2)
).subscribe();

Чего мне не хватает?

1 Ответ

1 голос
/ 17 июня 2019

хороший вопрос, теперь давайте углубимся в объяснение.

Сначала давайте посмотрим на решение

function test(limitter) {
  return function(source) {
    return new Observable(observer => {
      return source.subscribe({
        next(value) {
          observer.next(value);
        },
        error(error) {
          observer.error(error);
        },
        complete() {
          console.log("completed action");
          observer.complete("completed value");
        }
      });
    });
  };
}

interval(1000)
  .pipe(
    take(2),
    test()
  )
  .subscribe(
    x => {
      console.log("result: ", x);
    },
    err => {
      console.log(err);
    },
    end => {
      console.log("Observable has been completed");
    }
  );

Так в чем же разница, в этом фрагменте оператор take предшествует пользовательскому оператору test(), что означает, что всякий раз, когда мы достигаем желаемого количества (в нашемВ случае 2) оператор take вернет завершенный источник , что вызовет наш полный метод внутри последующих подписчиков (в нашем случае внутри пользовательского оператора test, а также внутри subscribe) после этого source больше не будет излучать ничего, потому что оно уже завершено.

Вы можете проверить источник => take () , для получения дополнительной информации не стесняйтесьспросить что-нибудь, если есть какие-то размытые части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...