订阅内部订阅重复多次

时间:2016-10-27 03:29:26

标签: angular firebase firebase-realtime-database rxjs angularfire

我有一个可以在订阅上输出数组的observable

appleProducts.subscribe((snap) => {
   console.log(snap);
});

iphone.subscribe((snap) => { 
   console.log(snap); 
});
  

控制台输出:

     
    

[ipad,iphone,mac]

         

[iphone4,iphone5,iphone6]

  

这两个订阅正在异步执行。但是,我需要在iphone之前获取appleProducts,所以当我将iphone.subscribe函数放在appleProducts.subscribe函数中时,会发生一些奇怪的事情:

appleProducts.subscribe((snap) => {
   console.log(snap);
   iphone.subscribe((snap) => { 
      console.log(snap);
   });
});
  

控制台输出:

     
    

[ipad,iphone,mac]

         

[iphone4的]

         

[iphone4,iphone5]

         

[iphone4,iphone5,iphone6]

  

有谁知道为什么会这样?感谢

3 个答案:

答案 0 :(得分:1)

要从下一个结果获得一个observable的结果,请使用instance operator concat

appleProducts.concat(iphone).subscribe(...)

订阅将首先输出第一个observable的结果。完成后,它将输出第二个结果。

使用static method concat

可以获得相同的结果
Observable.concat(appleProducts, iPhone).subscribe(...)

答案 1 :(得分:0)

所以在引导rxjs的'concat'功能后,我调查了其他的东西,比如'forkJoin'(哪些不起作用),我找到了我的解决方案'merge'

示例代码解决方案:

var source = Rx.Observable.merge(
    appleProducts,
    iphone);

var subscription = source.subscribe(
    function (x) {
        console.log('Next: ' + x);
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
    });
  

控制台输出:

     
    

[ipad,iphone,mac]

         

[iphone4,iphone5,iphone6]

  

答案 2 :(得分:0)

您使用的是AngularFire2吗?如果是,那么它与Firebase列表问题有关。 他们正在努力

请参阅此https://github.com/angular/angularfire2/issues/574