鉴于.retry()
的{{3}}:
// Try three times to get the data and then give up
var source = get('url').retry(3);
get()
返回什么?有人可以提供实现来使示例工作吗?即实际重试一些异步代码3次。
我刚刚开始使用RxJS,并且我正在尝试理解语义,并且获得上述示例将非常有用,谢谢!
答案 0 :(得分:4)
get
会返回Observable
。 retry
执行的操作是订阅基础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
将确保问题不是一个短暂的网络问题。