你为什么要flatMap的fromPromise获得重试工作?
('/ 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');
});
Run Code Online (Sandbox Code Playgroud)
我想削减仪式,只是:
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');
});
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,xhr调用仅执行一次.
pau*_*els 30
因为Promises没有用于重试的API.fromPromise只是包装Promise并通过Observable发出它.当你打电话时_this.$http.get('error')你已经创建了一个Promise并且它已经在飞行中,所以没有办法再次调用该方法就无法重试诺言.
包装时它起作用的原因flatMap是因为当你重试时Observable它实际上是重新执行生成promise的方法.
如果详细程度确实对您造成伤害,请认识到许多运算符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'));
Run Code Online (Sandbox Code Playgroud)
或者甚至更简单地使用defer:
Observable.defer(() => _this.$http.get('/error'))
.retry(3)
.subscribe(
(x) => console.log('Next: ' + x),
(err) => console.log('Error: ' + err),
() => console.log('Completed'));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4872 次 |
| 最近记录: |