2014-12-09 81 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和相關的庫/模式旨在僅在需要時提供幫助,而不會控制如何編寫每個組件。