rxcpp - 当observable发出一个值时,为什么不调用所有观察者的on_next函数

时间:2016-09-18 05:13:44

标签: c++ reactive-programming reactivex rxcpp

我试图了解如何使用rxcpp,我的印象是当一个observable发出一个值时,所有被订阅的观察者都会通过调用他们的on_next()方法得到通知,并将它们传递给它们。 / p>

以下示例不是这种情况:

auto eventloop = rxcpp::observe_on_event_loop();

printf("Start task\n");

auto values = rxcpp::observable<>::interval(std::chrono::seconds(2)).map(
        [](int i){
            printf("Observable sending: %d\n", i);
            return i;
        }
);

values.
    subscribe_on(eventloop).
    take(2).
    as_blocking().
    subscribe(
        [](int v){printf("#1 onNext: %d\n", v);},
        [](){printf("#1 onCompleted\n");});

values.
    subscribe_on(eventloop).
    take(2).
    as_blocking().
    subscribe(
        [](int v){printf("#2 onNext: %d\n", v);},
        [](){printf("#2 onCompleted\n");});

printf("Finish task\n");

我希望输出类似于:

Start task
Observable sending: 1
#1 onNext: 1
#2 onNext: 1
Observable sending: 2
#1 onNext: 2
#1 onCompleted
#2 onNext: 2
#2 onCompleted
Finish task

即。当新值出现时,在所有订阅的观察者上调用on_next。

相反,输出实际上是:

Start task
Observable sending: 1
#1 onNext: 1
Observable sending: 2
#1 onNext: 2
#1 onCompleted
Observable sending: 1
#2 onNext: 1
Observable sending: 2
#2 onNext: 2
#2 onCompleted
Finish task

1 个答案:

答案 0 :(得分:2)

这是典型的热与冷行为。

一个热门的观察者会像你期望的那样做。 Interval是一个冷可观察对象,因此每个订阅都会产生一组独立的值。

发布运算符将采用单个冷可观察对象并将其作为热可观察对象共享。

在这种情况下,它会。

auto sharedvalues = values.publish().ref_count();

然后在订阅表达式中使用sharedvalues而不是values

搜索热与冷可观察量将找到对该主题的广泛讨论。