为什么你必须flatMapfromPromise让重试工作?
('/error'返回状态500)
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');
});
我想在仪式上剪断,只剩下:
Rx.Observable.fromPromise(_this.$http.get('error')).
retry(3).
subscribe(
function (x) {
console.log('Next: ' + x);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
在第二种情况下,xhr调用只执行一次。
因为Promises
没有用于重试的API。fromPromise
只是包装了Promise
,让它通过一个可观察对象发射。当你调用_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'));