Rx fromPromise并重试

时间:2015-10-12 02:47:04

标签: rxjs

为什么你必须 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调用仅执行一次。

1 个答案:

答案 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'));