我一直在這裏尋找答案。沒有運氣,所以我試圖弄清楚自己。
所以,如果你聽到Jing在這個細分市場上說的話,我認爲你不會維護一個獨立的商店,並且處於變異狀態。她說要堅持樂觀的動作。她還提到,消除這些突變是一種痛苦,而且它們是。 跟蹤變異狀態是敵人。
她描述的是緩存和驗證用戶正在採取的操作,並且而不是這些操作如何變化狀態。
因此,讓我們創建待辦事項並將其保存到服務器異步。目標是按照發生的順序保存這些操作。每次視圖都要求提供todos時,請立即應用這些突變。該視圖不會知道髒模型之間的區別或保存模型,因爲它不需要。但是真相源頭唯一改變的時機是服務器響應成功或失敗。
// ........................
// === Add Todo Action ===
// ^^^^^^^^^^^^^^^^^^^^^^^^
var addTodoAction = function(todo) {
var actionId = guid();
Dispatcher.dispatch({
actionType: 'ADD_TODO',
actionId: actionId,
payload: todo
});
// Async Operation (save to server)
// Callbacks for success and error
API.addTodo(todo, function(res) {
Dispatcher.dispatch({
actionType: 'ADD_TODO_SUCCESS',
actionId: actionId, // Identify the same optimistic action
payload: res.todo
});
}, function(err) {
Dispatcher.dispatch({
actionType: 'ADD_TODO_FAILURE',
actionId: actionId, // Identify the same optimistic action
error: err
});
});
};
// ................................
// === Private Todos Collection ===
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
var _todos = new Immutable.OrderedMap();
// Add todo to collection
var addTodo = function(todo) {
_todos = _todos.set(todo.id, todo);
};
// ........................................
// === Collection of Optimistic Updates ===
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
var _actions = new Immutable.OrderedMap(); // Ordered Immutable Map to preserve sequential order of mutations
// Add action to queue
var addAction = function(e) {
_actions = _actions.set(e.actionId, e);
};
// Remove action
var removeAction = function(e) {
_actions = _actions.delete(e.actionId);
};
// ........................................................
// === Create Mutation of Source of Truth for the View ===
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
var getOptimisticTodos = function() {
// Loop through optimistic mutations in order, and apply them to a copy of the state.
return _.reduce(_actions.toArray(), function(todos, action) {
switch (action.actionType) {
case 'ADD_TODO':
todos = todos.set(action.payload.id, action.payload);
break;
default:
}
return todos;
}, _todos.asImmutable());
};
// ..........................................
// === Create a Public API for Todo Store ===
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
var TodoStore = _.extend({}, Events, {
getTodos: function() {
return getOptimisticTodos();
}
});
// ......................................
// === Register actions we care about ===
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/* Example Dispatch
*
* {
* actionId: 12345,
* actionType: 'ADD_TODO_SUCCESS',
* payload: {
* id: 12345,
* text: 'Example Todo'
* }
*
* }
*
*/
TodoStore.dispatchToken = Dispatcher.register(function(e){
switch (e.actionType) {
case 'ADD_TODO':
addAction(e); // add optimistic action to queue
TodoStore.trigger('change'); // let views know about change
break;
case 'ADD_TODO_SUCCESS':
removeAction(e); // remove optimistic action because it succeeded
addTodo(e.payload); // add todo to source of truth
TodoStore.trigger('change'); // let views know about change
break;
case 'ADD_TODO_FAILURE':
removeAction(e); // remove optimistic action because it failed
console.log(e.error); // handle error in store or elswhere
TodoStore.trigger('change'); // let views know about change
break;
default:
}
});
我使用[DOJOComments(https://github.com/winduptoy/DOJOComments)沒有什麼建設性的比+1說其他! –