【问题标题】:Subscribe inside a Subscribe repeating multiple times订阅重复多次
【发布时间】:2016-10-27 03:29:25
【问题描述】:

我有一个 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]


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

【问题讨论】:

  • 两个可观察对象之间是否存在依赖关系?意思是你需要第一个输出来触发第二个吗?从您显示的代码看起来不像,但只是确认,因为它会改变答案。如果只是为了订单,那么@BeetleJuice 有正确的答案。

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


【解决方案1】:

要在下一个结果之前从一个 observable 中获取结果,请使用 instance operator concat

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

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

您可以使用static method concat获得相同的结果

Observable.concat(appleProducts, iPhone).subscribe(...)

【讨论】:

  • @ArielGelbard 你能仔细检查一下:如果你只是做iphone.subscribe(...),你会打印一个数组吗?
  • 是的,我检查了三次,它不工作......它订阅了 firebase observable ex."this.angularfire.database.list(appleProductsObjectURL).subscribe("
  • @ArielGelbard 好的。您的 OP 给人的印象是简单的订阅有效,但是当您尝试订购结果时事情就崩溃了。如果即使是简单的iphone.subscribe(...) 也不起作用,那么您可能会找到问题的根源,而不是结果的顺序。
  • concat 只调用第一个属性'appleProducts',它也不调用'iPhone'...
【解决方案2】:

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

看到这个https://github.com/angular/angularfire2/issues/574

【讨论】:

    【解决方案3】:

    所以在被引导到 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]

    【讨论】:

    • 当心:merge 不保证一个来源的结果会在另一个来源的结果之前到达;它只是在数据到达时输出数据。因此,如果订单对您很重要(这是您声明的目标),那么您以后可能会让自己头疼。
    • 是的,你是对的,顺序对我来说很重要,你有什么建议呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2017-04-19
    • 2011-02-01
    相关资源
    最近更新 更多