Согласно этот artcle, onComplete и onError функции subscribe являются взаимоисключающими.

Означает либо onError, либо onComplete события будут запускаться в моей подписке.
У меня есть логический блок, который должен выполняться независимо от того, получаю ли я сообщение об ошибке или успешно завершаю поток информации.

Я искал что-то вроде , наконец, в python, но все, что я нашел, это наконец, который необходимо прикрепить к наблюдаемое я создаю.

Но я хочу использовать эту логику только при подписке и после завершения потока, успешно или с ошибкой.

Есть идеи?

Amir Tugi

Ответов: 3

Ответы (3)

Текущий «конвейерный» вариант этого оператора называется finalize () (начиная с RxJS 6). Более старый и ныне устаревший оператор «patch» назывался finally () (до RxJS 5.5).

Я думаю, что оператор finalize () действительно правильный. Вы говорите:

выполняю эту логику, только когда я подписываюсь, и после того, как поток закончился

, что, я думаю, не проблема. Вы можете иметь один источник и использовать finalize () перед подпиской на него, если хотите. Таким образом, вы не обязаны всегда использовать finalize ():

let source = new Observable(observer => {
  observer.next(1);
  observer.error('error message');
  observer.next(3);
  observer.complete();
}).pipe(
  publish(),
);

source.pipe(
  finalize(() => console.log('Finally callback')),
).subscribe(
  value => console.log('#1 Next:', value),
  error => console.log('#1 Error:', error),
  () => console.log('#1 Complete')
);

source.subscribe(
  value => console.log('#2 Next:', value),
  error => console.log('#2 Error:', error),
  () => console.log('#2 Complete')
);

source.connect();

На консоль выводится:

#1 Next: 1
#2 Next: 1
#1 Error: error message
Finally callback
#2 Error: error message

Январь 2019: Обновлено для RxJS 6

Единственное, что у меня сработало, это

fetchData()
  .subscribe(
    (data) => {
       //Called when success
     },
    (error) => {
       //Called when error
    }
  ).add(() => {
       //Called when operation is complete (both success and error)
  });

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

Простой пример:

// Simulate an AJAX callback...
of(null)
  .pipe(
    delay(2000),
    finalize(() => {
      // Do some work after complete...
      console.log('Finalize method executed before "Data available" (or error thrown)');
    })
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  );

Мне пришлось использовать метод add в подписке, чтобы выполнить то, что я хочу. Обычно выполняется обратный вызов finally после успешного или ошибочного обратного вызова. Как try..catch..inally block или Promise.finally method.

Простой пример:

// Simulate an AJAX callback...
of(null)
  .pipe(
    delay(2000)
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  )
  .add(() => {
    // Do some work after complete...
    console.log('At this point the success or error callbacks has been completed.');
  });

2022 WebDevInsider