3

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 リクエストは実際には 2 回行われます。これは、最初に予想したことではありません。

RxJS をさらに学習し、Hot および Cold Observable の理解を深めた後、CustomDriver ストリームに 2 つのサブスクリプション (1 つは error$ 用、もう 1 つは data$ 用) を作成していることに気付きましたObservable.just。各加入者。

だから私は 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また、エラーを失うことなくリクエストの重複を回避するにはどうすればよいですか?

4

2 に答える 2

2

.shareReplay(1)望ましい結果が得られるようです。

于 2016-04-29T00:01:50.060 に答える