首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Func读取IObservable的最新项目?

如何从Func读取IObservable的最新项目?
EN

Stack Overflow用户
提问于 2014-05-08 14:09:41
回答 3查看 292关注 0票数 0

我在写一个用户界面。在某些操作中,我想知道某个特定IObservable的最新值。我怎么知道呢?

这是一个模拟我想要达到的目标的测试。你能帮我修一下吗?

代码语言:javascript
复制
var selectedItemOut = new Subject<int?>();

// idea: define some other IObservable or subject here

var getLatest = new Func<int?>(() =>
{
    // fix me
    return 0;
});

Assert.AreEqual(null, getLatest());

selectedItemOut.OnNext(4);
Assert.AreEqual(4, getLatest());

selectedItemOut.OnNext(5);
Assert.AreEqual(5, getLatest());

selectedItemOut.OnNext(6);
selectedItemOut.OnNext(7);
Assert.AreEqual(7, getLatest());
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-08 19:11:14

如果您可以像Slugart那样将您的selectedItemOut Subject更改为BehaviorSubject,那将是最好的(我将先更改()以获取(1),但这只是我)。如果不能,则需要在函数作用域之外创建一个变量。

代码语言:javascript
复制
var selectedItemOut = new Subject<int?>();

// Hold the last result from the OnNext
int? results = null;

// idea: define some other IObservable or subject here

// update var each time OnNext is called
var lastResult = selectedItemOut.Subscribe(i => results = i);

// just a wrapper around the results var.
var getLatest = new Func<int?>(() => results);
Assert.AreEqual(null, getLatest());

selectedItemOut.OnNext(4);
Assert.AreEqual(4, getLatest());

selectedItemOut.OnNext(5);
Assert.AreEqual(5, getLatest());

selectedItemOut.OnNext(6);
selectedItemOut.OnNext(7);
Assert.AreEqual(7, getLatest());

//Need to tell the observable to stop updating the results var.
lastResultDispose.Dispose();

现在,您的func只是引用结果var,您需要告诉它何时停止跟踪它。这不是很好的Rx,因为Rx是关于推送值的,您想从它中检索一个值。

票数 2
EN

Stack Overflow用户

发布于 2014-05-08 20:47:29

如果selectedItemOut可以是BehaviourSubject<int?>,则可以使用它的Value属性:

代码语言:javascript
复制
var selectedItemOut = new BehaviorSubject<int?>(null);

var getLatest = new Func<int?>(() =>
{
    return selectedItemOut.Value;
});

否则,CharlesNRice的答案看起来很好,或者您可以使用MostRecent

代码语言:javascript
复制
var mostRecent = selectedItemOut.MostRecent(null).GetEnumerator();    
var getLatest = new Func<int?>(() =>
{
    mostRecent.MoveNext();
    return mostRecent.Current;
});

// need to clean up this up
mostRecent.Dispose() 
票数 2
EN

Stack Overflow用户

发布于 2014-05-08 17:26:10

假设您想要一个初始值(即使它是null),那么最近的一个值可以与BehaviorSubject一起使用First()。关于上下文的更多信息将有助于提供更好的解决方案,因为不建议使用First()

代码语言:javascript
复制
var selectedItemOut = new BehaviorSubject<int?>(null);

// idea: define some other IObservable or subject here
Assert.AreEqual(null, selectedItemOut.First());

selectedItemOut.OnNext(4);
Assert.AreEqual(4, selectedItemOut.First());

selectedItemOut.OnNext(5);
Assert.AreEqual(5, selectedItemOut.First());

selectedItemOut.OnNext(6);
selectedItemOut.OnNext(7);
Assert.AreEqual(7, selectedItemOut.First());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23544243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档