我想使用 angular-rx 作为结果的简单刷新按钮。如果用户单击刷新按钮,则重新加载结果。如果用户在 1 秒内单击刷新按钮 100 次,则仅加载最新结果。如果结果由于某种原因失败,这并不意味着刷新按钮应该停止工作。
为了实现最后一点,即使失败,我也想保留订阅(或重新订阅),但我不知道该怎么做?
这不起作用,但这是一个简单的示例,我尝试在错误时重新订阅:
var refreshObs = $scope.$createObservableFunction('refresh');
var doSubscribe = function () {
refreshObs
.select(function (x, idx, obs) {
// get the results.
// in here might throw an exception
})
.switch()
.subscribe(
function (x) { /*show the results*/ }, // on next
function (err) { // on error
doSubscribe(); // re-subscribe
},
function () { } // on complete
);
};
doSubscribe();
我认为这很常见,应该有一些标准做法来实现这一点?
更新
使用建议的解决方案,这是我所做的测试:
// using angularjs and the rx.lite.js library
var testCount = 0;
var obsSubject = new rx.Subject(); // note. rx is injected but is really Rx
$scope.refreshButton = function () { // click runs this
obsSubject.onNext();
};
obsSubject.map(function () {
testCount++;
if (testCount % 2 === 0) {
throw new Error("something to catch");
}
return 1;
})
.catch(function (e) {
return rx.Observable.return(1);
})
.subscribe(
function (x) {
// do something with results
});
这些是我的测试结果:
- 单击了刷新按钮
- obsSubject.onNext() 调用
- map 函数返回 1。
- subscribe onNext 被触发
- 单击了刷新按钮
- obsSubject.onNext() 调用
- 映射函数抛出错误
- 进入catch函数
- subscribe onNext 被触发
- 单击了刷新按钮
- obsSubject.onNext() 调用
- 没有什么。我需要继续订阅
我的理解是 catch 应该保留订阅,但我的测试表明它没有。为什么?