RxJS retry() 语义

RxJS retry() semantics

鉴于此 example .retry()

// Try three times to get the data and then give up
var source = get('url').retry(3);

get()return是什么意思?有人可以提供一个实现来使这个例子工作吗?即实际重试一些异步代码 3 次。

我刚开始使用 RxJS,我正在尝试理解其语义,获得上面的示例真的很有帮助,谢谢!

get returns 一个 Observableretry 所做的是订阅底层 Observable 并捕获 onError 调用,然后重新订阅 Observable,同时从下游隐藏 onError,从而保持从终止流。 Observable 的唯一要求是它必须 "start on subscribe" 语义,或者换句话说是冷 Observable.

所以 get 可以实现为:

function get() {
  var count = 0;
  return Rx.Observable.create(function(observer) {
    if (++count < 2) observer.onError(new Error());
    else {
      observer.onNext("Yay!");
      observer.onCompleted();
    }
  });
}

编辑

我重新阅读了您的问题,我认为我误解了您的问题。我给出的第一个示例只是一种快速查看如何制作可与 retry 一起使用的简单 Observable 的方法。在 get 给出的场景中,它正在执行某种 http 请求。

以下是使用 RxJS-DOM Library 执行 Ajax 请求,但您也可以使用其他具有 Promises 的库。

//With RxJS DOM
function get(url) {
  return Rx.DOM.ajax({url : url});
} 

//With JQuery Promises
function get(url) {
  return Rx.Observable.defer(function() {
    return $.ajax(url);
  });
}

在这两种情况下,您都在访问一些可能会出错的远程服务器资源。在其后添加 retry 可确保该问题不是暂时性网络问题。