为什么你必须 flatMap fromPromise 才能让重试工作?
(' /错误'返回状态500)
window.onbeforeunload = function() {
return 'You are leaving the page!';
};
我想切断仪式,只是:
var responseStream = Rx.Observable.just('/error').
flatMap(requestUrl => {
return Rx.Observable.fromPromise(_this.$http.get(requestUrl));
});
responseStream.
retry(3).
subscribe(
function (x) {
console.log('Next: ' + x);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
在第二种情况下,xhr调用仅执行一次。
答案 0 :(得分:27)
因为Promises
没有用于重试的API。 fromPromise
只是包裹Promise
并使其通过Observable发出。当您致电_this.$http.get('error')
时,您已经创建了Promise
并且它已经在飞行中,因此无法在不再次调用该方法的情况下重试承诺。
使用flatMap
包装时它起作用的原因是因为当您重试Observable
时,它实际上正在重新执行生成承诺的方法。
如果详细程度确实对您造成伤害,请认识到许多运营商隐式支持Promises
,而无需调用fromPromise
方法。
所以你的例子可以简化为
var responseStream = Rx.Observable.just('/error')
.flatMap(requestUrl => _this.$http.get(requestUrl));
responseStream
.retry(3)
.subscribe(
(x) => console.log('Next: ' + x),
(err) => console.log('Error: ' + err),
() => console.log('Completed'));
甚至更简单地使用defer
:
Observable.defer(() => _this.$http.get('/error'))
.retry(3)
.subscribe(
(x) => console.log('Next: ' + x),
(err) => console.log('Error: ' + err),
() => console.log('Completed'));