【问题标题】:Rxjs: retry a promise?Rxjs:重试一个承诺?
【发布时间】:2017-01-26 15:01:56
【问题描述】:

想知道为什么我的承诺正在解决但尝试重试。

var getResultsStream = url => Rx.Observable.onErrorResumeNext( 
     Rx.Observable.defer( () => Rx.Observable
        .fromPromise( getSearchResults(url)
        .catch(error => Rx.Observable.of(`Error: ${error}`)) )
        .timeout(20000, new Error(`Timeout: ${url}`))
     )
     .do( e => console.log(`Retrying: ${url}`))
     .retry(3)
)

重试承诺 3 次是否更好?

【问题讨论】:

    标签: javascript rxjs rxjs5


    【解决方案1】:

    除非您对 defer 和/或 onErrorResumeNext 有特殊用途,否则您可以将其全部扔掉并简单地使用:

    const request = url => Rx.Observable.of(url)
            .do(url => console.log("requesting: " + url))
            .switchMap(url => Rx.Observable.fromPromise(getSearchResults(url)))
            .timeout(20000, new Error(`Timeout: ${url}`))
            .retry(3);
    
    request("http://foobar.com").subscribe(console.log, console.error);
    
    function getSearchResults(url) {
      // simulating request-error
      throw new Error("Could not reach: " + url);
    }
    <script src="https://npmcdn.com/@reactivex/rxjs@5.0.0-beta.10/dist/global/Rx.umd.js"></script>

    【讨论】:

    • 我添加了onErrorResumeNext ,所以如果发生错误它不会中断流,在这种情况下,如果流失败 3 次,我将如何保持流处于活动状态?
    • 您为什么要这样做?什么都不会再发生了——所有重试都被使用了——但这也是 rxjs 的基本原则之一,错误被正确处理,这个 SO-entry 有点相关:stackoverflow.com/questions/41827371/…
    • 最后但同样重要的是:onErrorResumeNext 不会让流保持活动状态(请参阅此处的文档:github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/…
    • 但是没有下一步 - 所以它会停止(这完全没问题,因为对于这个流,真的不需要让它保持活跃) - 不应该保持活跃的流:休息- 调用,数据处理,基本上任何可能引发错误的东西 - 应该保持活动的流:数据提供者、套接字连接、触发器、用户输入的侦听器,基本上任何只是发出数据并且不会抛出的东西一个错误
    • 我是个白痴,这是一个更大的流中的一个流,在这个流之后还有十几个其他步骤。我只是想确保那些还可以
    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多