RxJS指定变量的Observable方法

时间:2016-06-16 18:01:18

标签: javascript rxjs observable

为什么必须链接可观察的实例方法才能使它们起作用。如果将一个observable赋给变量,然后应用一个新的observable方法,则不会调用新方法。

例如,这有效:

var source = Rx.Observable.range(1, 3)
  .map(function (x) {
        return x;
    })
  .finally(function() {
    console.log("Finally");
  });

var subscription = source.subscribe(
    function (x) {
        console.log('Next: ' + x);
    },
    function (err) {
        console.log('Error: ' + err);   
    },
    function () {
        console.log('Completed');   
    });
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.28/rx.all.min.js"></script>

但是这不会调用finally()方法:

var source = Rx.Observable.range(1, 3)
  .map(function (x) {
        return x;
    });

// This is never called
source.finally(function() {
  console.log("Finally");
});

var subscription = source.subscribe(
    function (x) {
        console.log('Next: ' + x);
    },
    function (err) {
        console.log('Error: ' + err);   
    },
    function () {
        console.log('Completed');   
    });
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.28/rx.all.min.js"></script>

1 个答案:

答案 0 :(得分:1)

可观察方法不会向原始observable添加操作,然后返回原始observable以传递给该行。他们实际上返回了一个新的观察者。

上面的第二个例子不起作用,因为source.finally()不会将finally()方法附加到源observable。相反,它返回一个新的observable,它将调用finally()方法。所以在这个例子中,源变量不知道source.finally()被调用了。为了使示例两个工作,我们需要以下内容:

var source = Rx.Observable.range(1, 3)
  .map(function (x) {
        return x;
    });

source = source.finally(function() {
  console.log("Finally");
});

var subscription = source.subscribe(
    function (x) {
        console.log('Next: ' + x);
    },
    function (err) {
        console.log('Error: ' + err);   
    },
    function () {
        console.log('Completed');   
    });
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.28/rx.all.min.js"></script>