在基于 Redux 的应用程序中处理请求错误

Handling request errors in Redux-based application

假设我们有一个基于 Redux 的聊天应用程序。例如,您将使用什么策略来处理未送达的消息?我看到两种方式:

1.让用户发起消息重发。 它应该简化错误处理逻辑,但可能会对可用性产生负面影响。也有可能用户在同时与 channels/with 多人通话时甚至没有注意到有任何未送达的消息。

2。实现一个 "worker" 来检查失败的消息并偶尔自动触发重新发送。 在这种情况下,用户将需要较少的手动工作,但应用程序应该具有更复杂的逻辑,我不太明白如何将它与 Redux 结合起来。

也可能存在对其他类型数据的请求失败。您将如何处理此类错误?在 Redux 状态下有一个序列化的失败请求池稍后重新发送是不是一个坏主意?

这实际上不在 Redux 的范围内,它更符合 redux-thunk 试图提供的异步功能。

考虑到您的用例,您可以实施乐观呈现(即,将所有消息视为成功,直到证明不是这样),并让您的 thunk 发送回滚以防万一失败。

大致理解我的意思

// your actionCreator / thunk
function (msg) {
    return function(disptach, getState) {
        // optimistic disptach
        dispatch({
            type: "SEND_MESSAGE",
            data: msg
        });

        ajax({
            url: "https://someservice.com/sendMessage",
            method: "POST",
            data: msg,
            onFailure: function(r) {
                // handle failure with rollback
                dispatch({
                    type: "SEND_MESSAGE_FAILED",
                    data: msg,
                    meta: {
                        error: r.responseText
                    }
                });
            }
        });
    }
}

有了这样的实现,那么你的第一个选项更合适。通知用户失败应由 UI 组件处理,该组件对与消息传递错误相关的状态更改做出反应。

我认为这两个用例都可以通过 Redux Saga middleware. It has some initial learning curve (especially if you never worked with generators) but it lets you describe long-running processes (“sagas”) that can “take” actions you dispatch, do some async work based on them, use control flow such as conditions and loops, and “put” the result actions when they are ready. See also 优雅地解决,以介绍 sagas。

或者,您可以查看 Redux Loop,它扩展了减速器,除了状态更改之外,还具有 return“效果”的能力。这使您可以从减速器“return 一个 AJAX 调用”,并继续这样做以响应操作,这也可以帮助您实现重试,尽管是以更明确的方式。