RxJS:在循环中处理错误.js自定义驱动程序

RxJS: Handing errors in cycle.js custom driver

本文关键字:错误 js 自定义 驱动程序 处理 循环 RxJS      更新时间:2023-09-26

我在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 它包括处理错误的帮助程序(successfailure )。

您可以像这样创建驱动程序:

    import {makeAsyncDriver} from 'cycle-async-driver'
    customDriver = makeAsyncDriver(
     (request) => requestHanderThatReturnsPromise(reques)
    )