假设我们有一个基于Redux的聊天应用程序。您将使用什么策略来处理未传递的消息?我看到两种方式:
1。让用户发起重新发送消息。 它应该简化错误处理逻辑,但可能会对可用性产生负面影响。在多个频道/同时与多个人交谈时,用户可能甚至没有注意到任何未传递的消息。
2。实施"工人"这将检查失败的消息,并在一段时间内自动触发重新发送。在这种情况下,用户将需要较少的手动工作,但应用程序应该有更复杂的逻辑,我真的不明白如何将它与Redux结合在一起。
此外,对其他类型数据的请求也可能失败。你会如何处理这些错误?将一个Redux状态的序列化失败请求池稍后重新发送是不是一个坏主意?
答案 0 :(得分:2)
我认为Redux Saga中间件可以优雅地解决这两个用例。它有一些初步的学习曲线(特别是如果你从未使用过生成器)但它可以让你描述长时间运行的进程(“sagas”),可以“采取”你发送的动作,做一些基于它们的异步工作,使用控制流程等作为条件和循环,并在结果动作准备好时“放置”它们。另请参阅this answer了解传奇介绍。
或者,您可以查看Redux Loop扩展Reducer,除了状态更改之外还能够返回“效果”。这使您可以从reducer“返回一个AJAX调用”,并继续执行该操作以响应操作,这也可以帮助您实现重试,尽管是以更明确的方式。
答案 1 :(得分:1)
这不是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组件处理,该组件对与消息传递错误相关的状态更改做出反应。