Rx fromPromise and retry



为什么你必须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'));

最新更新