Flux 动作创建者应该分派细化动作还是全面动作?

Should a Flux action creator dispatch granular actions or sweeping ones?

前提

我正在重构一些 Flux stores/actions/action 创作者以使其更加 Fluxy(PUBLISHPUBLISH_SUCCESSPUBLISH_FAILURE 而不是奇怪的 IS_LOADING 动作) ,并且想知道如何构建我的动作:我的动作创建者应该调用单个动作(PUBLISH_SUCCESS)还是多个动作(ADD_AUTHORADD_BOOK 等)?

例子

这是一个更具体的例子:

我有一个 TasksStore 用于保存我创新的新任务管理应用程序的待办事项,我有一个名字不太好的动作创建器 TaskActions 让我从服务器获取我的品种并添加新的 API。有点像这样:

const TasksStore = { ... };

const TaskActions = {
    fetchTasks(),
    addTask()
};

我应该调度什么操作来与 TasksStore 通信?

我看到两个选项:action-creator-api-specific actions (FETCH_TASKS, FETCH_TASKS_SUCCESS, FETCH_TASKS_FAILURE, ADD_TASK, ADD_TASK_SUCCESS, & ADD_TASK_FAILURE) 或可重复使用的操作(ADD_TASK 一遍又一遍地调用获取并调用一次 addTask())。

基本上,我的 API 应该是这样的(对于每个 action-creator-action,冗长的,可能是多余的,可分派的操作):

const TasksStore = {
    on('FETCH_SUCCESS', (tasks) => { // add tasks });
    on('ADD_SUCCESS', (task) => { // add task });
};

const TaskActions = {
    fetchTasks() {
        dispatch('FETCH');
        myApi.fetchTasks(
            (success_payload) => { dispatch('FETCH_SUCCESS', success_payload) },
            (failure_payload) => { dispatch('FETCH_FAILURE', failure_payload) }
        );
    },
    addTask() {
        dispatch('ADD');
        myApi.addTask(
            (success_payload) => { dispatch('ADD_SUCCESS', success_payload) },
            (failure_payload) => { dispatch('ADD_FAILURE', failure_payload) }
        );
    }
};

或像这样(简洁、可重复使用的可调度操作):

const TasksStore = {
    on('ADD', (task) => { // add task });
};

const TaskActions = {
    fetchTasks() {
        dispatch('FETCH');
        myApi.fetchTasks(
            (success_payload) => { 
                success_payload.forEach((task) => { dispatch('ADD', task); })
            },
            (failure_payload) => { dispatch('FETCH_FAILURE', failure_payload)
        );
    },
    addTask() {
        dispatch('ADD');
        myApi.addTask(
            (success_payload) => { dispatch('ADD', success_payload),
            (failure_payload) => { dispatch('ADD_FAILURE', failure_payload)
        );
    }
};

或介于两者之间?

谢谢!

我们决定采用更详细的路线:

对于 AJAX 操作(如示例中所示),我们调度特定的 "started" 操作,然后是 "success" 或 "failure" 操作:

dispatch('RETICULATE_SPLINES');
app.reticulateSpinesAndReturnPromise().then(
    (success) => { dispatch('RETICULATE_SPLINES_SUCCESS'); },
    (failure) => { dispatch('RETICULATE_SPLINES_FAILURE'); }
);

为什么?

  1. 这将动作创建者与动作分离了一点——动作创建者以调度动作的形式公开了一个统一的、可理解的 API:ActionCreator.fetchMessages 将调度一个 FETCH_MESSAGES 动作,而不是ADDFETCH_OR_ADD 或其他奇怪的东西。当没有意外调度时,理解像动作和存储这样的解耦系统(解耦是因为所有动作都通过调度程序)会容易得多。
  2. 它使多个商店更容易监听 action-creator-actions。当我们 .fetchMessages() 而不是 .postMessage() 时, MessageThreadsStore 是否需要更新?收听 FETCH_MESSAGES_SUCCESS,而不是 ADD,否则两者都可能被调用。

无论如何,希望对您有所帮助。