Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在flux应用程序中实现操作队列_Javascript_Reactjs_Flux - Fatal编程技术网

Javascript 如何在flux应用程序中实现操作队列

Javascript 如何在flux应用程序中实现操作队列,javascript,reactjs,flux,Javascript,Reactjs,Flux,据Jing Chen(Facebook)称,他们在upcomming中继框架中实现了类似的功能: 我只是好奇,是否有人在通量架构中实现了类似的东西,那么心智模型是什么样子的?据我所知,您将在“真相之源”存储之外创建一个附加存储,以保持乐观更新的状态。然后,根据服务器的反馈,您将以任何方式将其从乐观存储中取出,然后将其合并到“真实”存储中,或者跳过合并并重新渲染视图。视图同时显示“真理之源”存储中的内容和乐观存储中的内容,这一顺序是否正确 如果有人已经实现了类似的功能,那么如果你能分享你的经验和

据Jing Chen(Facebook)称,他们在upcomming中继框架中实现了类似的功能:

我只是好奇,是否有人在通量架构中实现了类似的东西,那么心智模型是什么样子的?据我所知,您将在“真相之源”存储之外创建一个附加存储,以保持乐观更新的状态。然后,根据服务器的反馈,您将以任何方式将其从乐观存储中取出,然后将其合并到“真实”存储中,或者跳过合并并重新渲染视图。视图同时显示“真理之源”存储中的内容和乐观存储中的内容,这一顺序是否正确


如果有人已经实现了类似的功能,那么如果你能分享你的经验和思维模式,那就太好了。

我也一直在这里寻找答案。运气不好,所以我自己想办法解决

所以,如果你听Jing在这一部分所说的话,我不认为你在用变异状态维护一个单独的存储。她说要坚持乐观的行动。她还提到,消除这些突变是一种痛苦,而且确实如此跟踪变异状态是敌人。

她所描述的是缓存和验证用户正在执行的操作,而不是这些操作如何改变状态


因此,让我们创建一个todo项并将其异步保存到服务器。目标是按操作发生的顺序保存操作。每次视图请求TODO时,都会动态应用这些突变。视图不知道脏模型和保存模型之间的区别,因为它不需要知道。但是,只有当服务器做出成功或失败的响应时,真相的来源才会改变

// ........................
// === 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:
    }
});

除了使用+1之外,我没有什么建设性的话要说!