0

我正在尝试将初始值设置为public ReactiveProperty<string> ConnectionStatus.

public ViewModelConstructor()
{
    ConnectionStatus = Observable
                    .Interval(RefreshInterval)
                    .Select(x => Observable.FromAsync(() => networkDiscovererService.CanDiscoverAsync("192.168.1.1", RequestTimeout)))
                    .Concat()
                    .Select(isConnected => isConnected ? $"connected" : $"not connected")
                    .ToReactiveProperty();
}

即使我试图像这样实例化它

public ReactiveProperty<string> ConnectionStatus { get; } =
            new ReactiveProperty<string>("Checking connectivity...");

在可观察对象返回某些内容之前,它仍然是空的。

有任何想法吗?我正在使用这个

4

1 回答 1

1

要使用 ReactiveProperty ctor 获取订阅的初始值(如 behaviorSubject 或 Replay(1)):

    [Test]
    public void ShouldReturnAValuOnSubscribe()
    {
        var testScheduler = new TestScheduler();
        var testableObserver = testScheduler.CreateObserver<int>();

        var reactiveProperty = new ReactiveProperty<int>(30);
        reactiveProperty.Subscribe(testableObserver);

        Assert.AreEqual(30, testableObserver.Messages.Single().Value.Value);
    }

使用 .ToReactiveProperty() 获取订阅的初始值(如 behaviorSubject 或 Replay(1)):

    [Test]
    public void ShouldReturnAValuOnToReactiveProperty()
    {
        var testScheduler = new TestScheduler();
        var testableObserver = testScheduler.CreateObserver<int>();

        var reactiveProperty = Observable.Never<int>().ToReactiveProperty(40);
        reactiveProperty.Subscribe(testableObserver);

        Assert.AreEqual(40, testableObserver.Messages.Single().Value.Value);
    }

不要在订阅时获得初始值 - 更改 ReactivePropertyMode:

    [Test]
    public void ShouldNotReturnAnInitialValue_WhenModeIsNone_AndOnSubscribe()
    {
        var testScheduler = new TestScheduler();
        var testableObserver = testScheduler.CreateObserver<int>();

        var reactiveProperty = new ReactiveProperty<int>(30, ReactivePropertyMode.None);
        reactiveProperty.Subscribe(testableObserver);

        Assert.IsEmpty(testableObserver.Messages);
    }

基本上,您正在寻找的是初始值ReactivePropertyMode.RaiseLatestValueOnSubscribe标志。

在第一种情况下,您忘记提供具有初始值的 ToReactiveProperty()(例如 ToReactiveProperty(30))

在第二种情况下它应该对你有用 - 默认情况下,模式设置为ReactivePropertyMode.RaiseLatestValueOnSubscribe(检查 ShouldReturnAValuOnSubscribe)。尝试明确设置模式(如ShouldNotReturnAnInitialValue_WhenModeIsNone_AndOnSubscribe)。

我使用了 ReactiveProperty 3.6.0。

顺便说一句,基于计时器测试连接不是一个好主意:)

于 2017-12-15T22:11:05.053 回答