首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应性扩展/ UI缓存web请求数据

反应性扩展/ UI缓存web请求数据
EN

Stack Overflow用户
提问于 2017-02-16 11:39:45
回答 1查看 343关注 0票数 1

我目前正在通过调用web服务来获取视图模型中的数据:

代码语言:javascript
复制
_loadDataCommand = ReactiveCommand.CreateFromObservable(
        () => Observable
            .StartAsync(ct => _getAllFunction(ct))
            .TakeUntil(_loadDataCancel));

_loadDataCancel只是一个充当取消信号的IObservable<bool>

目前,我已经得到了它,这样当vm被导航到时,就会执行load data命令。

对于特别昂贵的获取操作来说,这是有问题的,或者当用户只想离开视图回到他们离开视图的状态(例如列表中的选定项等)时。

我真正想要做的是让它能够使命令始终执行一个新的提取,但是我希望可以在nav-to上使用一个额外的可观察性,这将:

  1. 如果存在,则从缓存中检索数据
  2. 如果数据不存在,使用可观察到的LoadData (并插入到缓存中)

一些研究发现了一些粗略的信息,比如Memoize()MemoizeAll(),然而,它们似乎在rx中是不可用的(但在System.Interactive中)。

在这里搜索,找到了这样的答案:https://stackoverflow.com/a/12666462/639771,但是在查看了ReactiveUI的主源代码之后,我再也找不到ObservableAsyncMRUCache了。

我遗漏了什么吗?我几乎可以肯定,它会变得足够琐碎,但我完全不知所措。

PS:我知道Akavache是存在的,但是对于我的需要来说,它可能有点太重了。

EN

回答 1

Stack Overflow用户

发布于 2017-02-16 16:28:08

我觉得有几种方法可以做到这一点,这取决于更多的因素,但这基本上是你想要的吗?

代码语言:javascript
复制
IObservable<Object> GetFromServer()
{
        //Get From Server
        //Store in Cache
}
IObservable<Object> GetFromCache()
{
        return //returns something from cache or just return null;
}
...
 GetFromCache()
 .SelectMany(result =>
  {
      if (result == null)
          return GetFromServer();


       return Observable.Return(result);
  });

有一些变体可以将结果作为可观察到的一部分存储,但是这是如何实现的,这在某种程度上取决于您希望如何终止缓存。例如,您可以创建一个可观察到的连接,它只调用服务器一次,然后将结果重放给任何订阅者。

代码语言:javascript
复制
 GetFromServer()
   .Replay(1);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42272915

复制
相关文章

相似问题

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