RxJS重试()语义

时间:2015-09-20 14:44:16

标签: javascript rxjs

鉴于.retry()的{​​{3}}:

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

get()返回什么?有人可以提供实现来使示例工作吗?即实际重试一些异步代码3次。

我刚刚开始使用RxJS,并且我正在尝试理解语义,并且获得上述示例将非常有用,谢谢!

1 个答案:

答案 0 :(得分:4)

get会返回Observableretry执行的操作是订阅基础Observable并捕获onError调用,然后重新订阅Observable,同时将onError隐藏在下游,从而保留来自终止的流。只有Observable的要求是它必须“从订阅开始”语义或换句话说是冷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();
    }
  });
}

修改

我重新阅读了你的问题,并认为我误解了你的要求。我给出的第一个示例只是一种快速查看如何制作一个与Observable一起使用的简单retry的方法。在给出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将确保问题不是一个短暂的网络问题。