RxJS:在循环中处理错误.js自定义驱动程序
RxJS: Handing errors in cycle.js custom driver
我在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 并更好地了解了热可观察量和冷可观察量之后,我意识到我正在创建两个自定义驱动程序流订阅(一个用于 error$,一个用于 data$),并且由于自定义驱动程序可观察量是冷的,它将为每个订阅者重复Observable.just
。
所以我试图让我的自定义驱动程序观察热share
:
function makeCustomDriver() {
return function customDriver(requests$) {
return requests$
.map(request => Rx.Observable.fromPromise(makeFailedRequest()))
.share()
}
}
通过该更改,输出如下所示:
some API request
Error Completed
Log Completed
所以我设法摆脱了重复的请求,但错误在此过程中被吞噬了。
导致错误丢失的share
发生了什么,如何避免重复请求而不会丢失错误?
.shareReplay(1)
似乎给出了所需的结果。
有一个
工厂可以制作您想要的那种自定义驱动程序(来自 Promises),https://github.com/whitecolor/cycle-async-driver 它包括处理错误的帮助程序(success
和 failure
)。
您可以像这样创建驱动程序:
import {makeAsyncDriver} from 'cycle-async-driver'
customDriver = makeAsyncDriver(
(request) => requestHanderThatReturnsPromise(reques)
)
相关文章:
- Node.js v6.2.0类扩展不是函数错误
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- RxJS:在循环中处理错误.js自定义驱动程序
- 如何在快递中抛出 404 错误.js
- 如何捕获服务器错误 JS
- 帆的“500”错误.js“测试项目”
- 快递中的会话未定义错误.js
- jquery.validate 中的错误.js“javaScript 运行时错误:无法获取未定义或空引用的属性'
- 角度动画中的奇怪错误.js
- 如何删除“对象在节点中没有方法'forEach'错误.js”
- 错误 JS 将发布数据发送到控制器 -CodeIgniter
- 使用摩卡在节点上测试错误.js函数
- 为什么 Magento js/varien/form.js IE 中的错误 - js fiddle
- 检测导致冻结等问题的错误 JS
- 三中的错误.js:相机不是三的实例.照相机
- 编译错误js.72.未处理的错误
- PHP停止表单重新加载显示错误Js
- 节点中的套接字挂断错误.js使用 https 时
- 纹理加载错误(JS动画)
- jasmineNodeOpts:执行量角器时出现意外的标识符错误.js