代码之家  ›  专栏  ›  技术社区  ›  Syntax

Rx合并阻止初始值

  •  3
  • Syntax  · 技术社区  · 7 年前

    使用以下代码,我期望:

    first - OnNext(a)  <-- initial on subscribe
    first - OnNext(c)  <-- initial on subscribe
    first - OnNext(b)  <-- result of OnNext
    second - OnNext(b) <-- initial on subscribe
    second - OnNext(c) <-- initial on subscribe
    first - OnNext(d)  <-- result of OnNext
    second - OnNext(d) <-- result of OnNext
    

    first - OnNext(b)  <-- result of OnNext
    first - OnNext(d)  <-- result of OnNext
    second - OnNext(d) <-- result of OnNext
    

    代码:

    var connection1 = new BehaviorSubject<string>("a");
    var connection2 = new BehaviorSubject<string>("c");
    var connection = Observable.Merge(connection1, connection2).StartWith(connection1.Value, connection2.Value).Publish();
    connection.Connect();
    connection.SubscribeLogger("first");
    connection1.OnNext("b");
    connection.SubscribeLogger("second");
    connection2.OnNext("d");
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   Eric Olsson    7 年前

    Here 是一个链接,用于解释连接的可观察对象背后的一般理想(通过调用 Connect() 在合并输出上。

    什么时候 Connect() 被调用时,合并的输出将其发布的值发送给订阅者(此时没有,因此初始 a c

    然后 first 订阅和后续调用 connection1.OnNext("b"); b 第一

    second 订阅,但因为它是一个连接的可观察对象, 第二 将仅接收订阅后发布的值。因此 connection2.OnNext("d"); 第一 第二 .

        2
  •  2
  •   Shlomo    7 年前

    var connection1 = new BehaviorSubject<string>("a");
    var connection2 = new BehaviorSubject<string>("c");
    var connection = Observable.Merge(connection1, connection2).StartWith(connection1.Value, connection2.Value).Publish();
    connection.SubscribeLogger("first"); //Flip order, put Subscribe before connect
    connection.Connect();
    connection1.OnNext("b");
    connection.SubscribeLogger("second");
    connection2.OnNext("d");
    

    first - OnNext(a) //From the start with
    first - OnNext(c) //From the start with
    first - OnNext(a) //From the behavior subject
    first - OnNext(c) //From the behavior subject
    first - OnNext(b)
    first - OnNext(d)
    second - OnNext(d)
    

    Publish / Connect ,如果您想获得任何“on subscribe”值,则需要在连接之前进行订阅。在你之后 ,任何Cold或“on subscribe”值都不会到达新订阅者。

        3
  •  0
  •   Syntax    7 年前

    这段代码似乎实现了我想要的功能:

    var subject1 = new BehaviorSubject<string>("a");
    var subject2 = new BehaviorSubject<string>("c");
    // Use separate merged observables to simulate multiple calls to getter
    // under the hood which builds the new merged view of the subjects.
    var connection = subject1.Merge(subject2);
    var connection2 = subject1.Merge(subject2);
    
    connection.SubscribeLogger("first");
    subject1.OnNext("b");
    connection2.SubscribeLogger("second");
    subject2.OnNext("d");
    

    输出:

    first - OnNext(a)
    first - OnNext(c)
    first - OnNext(b)
    second - OnNext(b)
    second - OnNext(c)
    first - OnNext(d)
    second - OnNext(d)