你可以三立得无缓存最接近的是重置任何商店状态为空或[当请求新数据的动作进来。如果你这样做,你必须发出变化事件,否则你邀请竞赛条件。
作为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和相关的库/模式旨在仅在需要时提供帮助,而不会控制如何编写每个组件。
那么问题是,从我读的商店应该只发出一个事件被更改,并且发出不应该传递任何数据,你应该在回调中调用商店获取数据。如果我有一个页面,可以说一个项目管理系统的仪表板,其中我有3个单独的问题列表请求,每个过滤器都有不同的过滤。如果我只有1个问题存储,我怎么知道哪个请求在什么时候完成,如果我不缓存数据,我该如何处理它? – ryanzec 2014-12-09 17:47:02
它最终看起来像这样:在第一次调用store.getIssues时,如果商店没有数据,它会启动api请求并返回空结果。一旦api请求异步完成,就会分派一个操作,并且商店自行更新并发出更改事件。所以,现在原来的调用者再次调用store.getIssues,并且这次接收的是数据而不是空列表 – 2014-12-09 19:12:41
您仍然需要决定是否缓存任何数据以及如何使缓存失效 - 您可以缓存一些数据,如果商店收到陈旧数据的请求,商店返回陈旧数据,并调用api自行刷新(然后分派一个动作并导致另一个商店更改事件) – 2014-12-09 19:18:39