你可以三立得無緩存最接近的是重置任何商店狀態爲空或[當請求新數據的動作進來。如果你這樣做,你必須發出變化事件,否則你邀請競賽條件。
作爲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