Наблюдаемый Наконец на подписку
Согласно эта функция artcle, onComplete
и onError
функции subscribe
являются взаимоисключающими.
Значение onError
или onComplete
событий запустится в моем subscribe
.
У меня есть логический блок, который должен быть выполнен, если я получаю сообщение об ошибке, или я успешно закончу свой парол информации.
Я искал что-то вроде finally
в python, но все, что я нашел, finally
, который должен быть привязан к наблюдаемому я создаю.
Но я хочу сделать эту логику только при подписке и после того, как поток закончится, успешно или с ошибкой.
Любые идеи?
Ответы
Ответ 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)
});