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

Error handling 在基于Redux的应用程序中处理请求错误,error-handling,request,redux,Error Handling,Request,Redux,假设我们有一个基于Redux的聊天应用程序。您将使用什么策略来处理(例如)未送达的邮件?我认为有两种方式: 1。让用户启动消息重新发送。 它应该简化错误处理逻辑,但可能会对可用性产生负面影响。也有可能用户在多个频道/同时与多个人通话时甚至没有注意到有任何未送达的消息 2。实现一个“worker”,它将检查失败的消息,并偶尔触发自动重新发送。在这种情况下,用户将需要更少的手动工作,但应用程序应该有更复杂的逻辑,我真的不知道如何将其与Redux结合起来 此外,对其他类型数据的请求也可能失败。您将如何

假设我们有一个基于Redux的聊天应用程序。您将使用什么策略来处理(例如)未送达的邮件?我认为有两种方式:

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

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


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

这实际上不在Redux的范围内,它更多地是在异步功能方面寻求提供的

考虑到您的用例,您可以实现乐观呈现(即,在其他情况下,将所有消息视为成功消息),并在失败时让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的范围内,它更多地是在异步功能方面寻求提供的

考虑到您的用例,您可以实现乐观呈现(即,在其他情况下,将所有消息视为成功消息),并在失败时让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组件来处理,它会对与消息错误相关的状态更改做出反应。

我认为这两个用例都可以通过中间件优雅地解决。它有一些初始学习曲线(特别是如果您从未使用过生成器),但它允许您描述长时间运行的流程(“saga”),这些流程可以“采取”您分派的操作,基于它们执行一些异步工作,使用控制流(如条件和循环),并在准备就绪时“放置”结果操作。另请参阅,了解传奇故事的介绍


或者,您可以研究除了状态更改之外,还可以使用返回“效果”的功能扩展减速器。这允许您从reducer“返回AJAX调用”,并继续这样做以响应操作,这也可以帮助您实现重试,尽管是以更明确的方式进行的。

我认为这两个用例都可以通过中间件优雅地解决。它有一些初始学习曲线(特别是如果您从未使用过生成器),但它允许您描述长时间运行的流程(“saga”),这些流程可以“采取”您分派的操作,基于它们执行一些异步工作,使用控制流(如条件和循环),并在准备就绪时“放置”结果操作。另请参阅,了解传奇故事的介绍

或者,您可以研究除了状态更改之外,还可以使用返回“效果”的功能扩展减速器。这允许您从reducer“返回AJAX调用”,并在响应操作时继续这样做,这也可以帮助您实现重试,尽管是以更明确的方式