【问题标题】:Observable.prototype.concatAll does not seem to yield expected resultObservable.prototype.concatAll 似乎没有产生预期的结果
【发布时间】:2017-05-22 14:37:59
【问题描述】:

记住这段代码:

const Rx = require('rxjs');

var i = 3;

const obs = Rx.Observable.interval(10)
    .map(() => i++)
    .map(function(val){
        return Rx.Observable.create(obs => {
            obs.next(val)
        });
    })
    .take(10)
    .concatAll();


obs.subscribe(function(v){
    console.log(v);
});

我本来希望记录的结果是这样的:

[3,4,5,6,7,8,9,10,11,12]

即10个值,从3开始。

然而,我们得到的只是

3

有人知道为什么会这样吗?

【问题讨论】:

    标签: rxjs5 angular2-observables


    【解决方案1】:

    concatMap 将等待第一个 observable 完成,然后再订阅下一个。您忘记将 .complete() 添加到您的内部 observable 中,实际上让您的流只发出第一个值 3 并无限期地等待第一个流完成,然后再连接下一个流。

    注意;对于根据您的问题的简单值发射,您还可以使用 Rx.Observable.of() 而不是 Rx.Observable.create()

    var i = 3;
    
    const obs = Rx.Observable.interval(10)
      .map(() => i++)
      .map(val => Rx.Observable.of(val))
      .take(10)
      .concatAll();
    
    obs.subscribe(v => console.log(v));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>

    【讨论】:

    • 非常感谢 - 我原以为 100% 的 take(10) 将消除您所说的对 complete() 调用的需要。您需要调用 complete() 是没有意义的。 take(10) 应该已经处理好了。抱歉,在这种情况下,RxJS 没有做正确的事 IMO。
    • 作为一个非常简单的例子马克:
    • const obs = Rx.Observable.interval(10) .toArray();
    • 以上受你描述的问题困扰
    • 抱歉,马克直到现在才看到你的评论,谢谢!
    猜你喜欢
    • 2015-04-20
    • 2019-12-13
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多