我在我的main
函数中实现了一些错误处理代码,如下所示。它使用catch
运算符过滤和报告一个流中的错误,并在另一个流中忽略它们。这使我能够了解和报告请求发生的错误,同时不会使整个流失败,以便后续请求可以继续。
由于下面的代码片段中可能不明显的原因,我正在实施一个自定义驱动程序来请求和处理数据。我没有使用循环 http 驱动程序。
这是我成功报告错误的代码:
function main(sources) {
// Catch driver errors so they can be logged
const error$ = sources.CustomDriver
.map(x => x.catch(e => Rx.Observable.just(e)))
.flatMap(p => p)
// Filter out the errors to deal with requests that did not fail
const data$ = sources.CustomDriver
.map(x => x.catch(e => Rx.Observable.empty()))
.flatMap(p => p)
return {
CustomDriver: Rx.Observable.just('initial event'),
Log: data$,
Error: error$
}
}
Cycle.run(main, {
CustomDriver: makeCustomDriver(),
Log: msg$ => { msg$.subscribe(
msg => console.log('LOG: ', msg),
err => console.log('problem with Log driver: ', err),
() => console.log('Log Completed')
) },
Error: msg$ => { msg$.subscribe(
e => console.log('ERR: ', e),
err => console.log('problem with Error driver:', err),
() => console.log('Error Completed')
) }
})
function makeCustomDriver() {
return function customDriver(requests$) {
return requests$
.map(request => Rx.Observable.fromPromise(makeFailedRequest()))
}
}
function makeFailedRequest() {
console.log('some API request')
return Promise.reject('error')
}
输出如下:
some API request
some API request
Log Completed
ERR: error
Error Completed
从好的方面来说,会报告错误。但是,API 请求实际上是两次发出的,这不是我最初预期的情况。
在学习了更多 RxJS 并对 Hot 和 Cold observables 有了更好的理解后,我意识到我正在创建两个 CustomDriver 流订阅(一个用于 error$,一个用于 data$),并且因为 CustomDriver Observable 很冷,它会重复Observable.just
for每个订户。
所以我试图让我的 CustomDriver Observavble 变热share
:
function makeCustomDriver() {
return function customDriver(requests$) {
return requests$
.map(request => Rx.Observable.fromPromise(makeFailedRequest()))
.share()
}
}
通过该更改,输出如下:
some API request
Error Completed
Log Completed
所以我设法摆脱了重复的请求,但错误在这个过程中被吞没了。
发生了什么share
导致错误丢失,如何避免重复请求而不会丢失错误?