說我有一個TodoStore。 TodoStore負責保管我的TODO物品。待辦事項項目存儲在數據庫中。助焊劑商店異步數據加載
我想知道什麼是加載所有的待辦事項進店,以及如何的意見應與存儲交互在啓動時加載的TODO項的推薦方式。
第一種方法是創建一個loadTodos
動作,它將從數據庫中檢索Todos併發出TODOS_LOADED
事件。視圖然後將調用loadTodos
操作,然後收聽TODOS_LOADED
事件,然後通過調用TodoStore.getTodos()
來更新自己。
另一種替代方法是沒有loadTodos
動作,並有一個TodoStore.getTodos()
,它將返回一個承諾與現有的TODO項目。如果TodoStore已經加載了TODO項目,它只是返回它們;如果沒有,那麼它將從數據庫中查詢並返回檢索到的項目。在這種情況下,即使商店現在已經加載了TODO項目,它也不會發出TODOS_LOADED事件,因爲getTodos
不是一個動作。
function getTodos() {
if (loaded)
return Promise.resolve($todoItems);
else
return fetchTodoItemsFromDatabase().then(todoItems) {
loaded = true;
$todoItems = todoItems;
return $todoItems;
});
}
我相信很多人會說,這打破了流量結構,因爲getTodos
功能正在改變商店狀態和存儲狀態應該只從雖然調度員發出的行動來改變。
但是,如果您認爲TodoStore的狀態是數據庫中現有的TODO項目,那麼getTodos
並不會真的改變任何狀態。 TODO項目完全相同,因此不需要更新或通知視圖。現在唯一的情況是商店已經檢索了數據,所以現在它被緩存在商店中。從View的角度來看,它不應該關心Store是如何實現的。如果商店仍然需要從數據庫中檢索數據,它應該不太在意。所有觀看者關心的是他們可以使用商店獲取TODO商品,並且當新的TODO商品被創建,刪除或更改時,商店將通知他們。
因此,在這種情況下,視圖應該只是調用TodoStore.getTodos()在加載時呈現它們自己,並在TODO_CHANGE上註冊一個事件處理程序,以便在需要通過添加,刪除或更改。
您如何看待這兩種解決方案?他們是否有其他解決方案?