2014-12-09 84 views
2

几乎所有的通量示例都涉及客户端的数据缓存,但我认为我无法为我的许多应用程序执行此操作。流量没有数据缓存?

在系统中,我考虑使用React/Flux,单个用户可以拥有数千个我们存储的主要数据(并且1条记录可能至少有75个数据属性)。在客户端缓存这么多的数据似乎是个不好的主意,可能会让事情变得更加复杂。

如果我没有使用Flux,我只需要一个ORM like系统,可以与REST API交谈,在这种情况下,无论我在最后一页中请求该数据,像userRepository.getById(123)这样的请求都将始终击中API。我的想法是让商店拥有这些方法。

Flux是否认为如果我对数据发出请求,它总是碰到API并且永远不会从本地缓存实例中提取数据?我可以以某种方式使用Flux吗?大多数数据检索请求总是要打到API?

回答

0

我认为在这种情况下使用Flux的最大优势是,其余应用程序不必关心数据永远不会被缓存,或者您使用的是特定的ORM系统。就您的组件而言,数据存储在商店中,数据可以通过操作进行更改。您的行为或商店可以选择始终访问API获取数据或在本地缓存某些部分,但您仍然可以通过封装这一魔术获胜。

+0

那么问题是,从我读的商店应该只发出一个事件被更改,并且发出不应该传递任何数据,你应该在回调中调用商店获取数据。如果我有一个页面,可以说一个项目管理系统的仪表板,其中我有3个单独的问题列表请求,每个过滤器都有不同的过滤。如果我只有1个问题存储,我怎么知道哪个请求在什么时候完成,如果我不缓存数据,我该如何处理它? – ryanzec 2014-12-09 17:47:02

+1

它最终看起来像这样:在第一次调用store.getIssues时,如果商店没有数据,它会启动api请求并返回空结果。一旦api请求异步完成,就会分派一个操作,并且商店自行更新并发出更改事件。所以,现在原来的调用者再次调用store.getIssues,并且这次接收的是数据而不是空列表 – 2014-12-09 19:12:41

+1

您仍然需要决定是否缓存任何数据以及如何使缓存失效 - 您可以缓存一些数据,如果商店收到陈旧数据的请求,商店返回陈旧数据,并调用api自行刷新(然后分派一个动作并导致另一个商店更改事件) – 2014-12-09 19:18:39

1

你可以三立得无缓存最接近的是重置任何商店状态为空或[当请求新数据的动作进来。如果你这样做,你必须发出变化事件,否则你邀请竞赛条件。

作为flux的替代品,您可以简单地使用promise和一个简单的mixin来修改状态。例如,蓝鸟:

var promiseStateMixin = { 
    thenSetState: function(updates, initialUpdates){ 
    // promisify setState 
    var setState = this.setState.bind(this); 
    var setStateP = function(changes){ 
     return new Promise(function(resolve){ 
      setState(changes, resolve); 
     }); 
    }; 

    // if we have initial updates, apply them and ensure the state change happens 
    return Promise.resolve(initialUpdates ? setStateP(initialUpdates) : null) 
     // wait for our main updates to resolve 
     .then(Promise.params(updates)) 
     // apply our unwrapped updates 
     .then(function(updates){ 
      return setStateP(updates); 
     }).bind(this); 
    } 
}; 

而在你的组件:

handleRefreshClick: function(){ 
    this.thenSetState(
     // users is Promise<User[]> 
     {users: Api.Users.getAll(), loading: false}, 

     // we can't do our own setState due to unlikely race conditions 
     // instead we supply our own here, but don't worry, the 
     // getAll request is already running 
     // this argument is optional 
     {users: [], loading: true} 
    ).catch(function(error){ 
     // the rejection reason for our getUsers promise 
     // `this` is our component instance here 
     error.users 
    }); 
} 

当然,这并不妨碍你的时候/它在你的应用程序是有意义的使用流量。例如,react-router在许多反应项目中都有使用,它在内部使用通量。 React和相关的库/模式旨在仅在需要时提供帮助,而不会控制如何编写每个组件。