Подтвердить что ты не робот

Наблюдаемый Наконец на подписку

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

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

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

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

Любые идеи?

4b9b3361

Ответ 1

Текущий "переносимый" вариант этого оператора называется finalize(). Более старый и теперь устаревший оператор "patch" был вызван finally().

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

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

это не проблема, я думаю. Вы можете иметь один source и использовать 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

Ответ 2

Сейчас я использую 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 medhod в подписке, чтобы выполнить то, что я хочу. По сути, обратный вызов finally после успешного завершения или обратного вызова ошибки. try..catch..finally блок Promise.finally или метод Promise.finally.

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

// 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.');
  });

Ответ 3

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

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