redux-thunk 和 redux-promise 有什么区别?
What is the difference between redux-thunk and redux-promise?
据我所知,如果我错了请纠正我,redux-thunk is a middleware which helps us dispatch async function and debug values in the action itself while when I used redux-promise我无法在不实现我自己的机制的情况下创建异步函数,因为 Action 会抛出仅调度普通对象的异常。
这两个软件包之间的主要区别是什么?在单页 React 应用程序中同时使用这两个包或坚持使用 redux-thunk 是否有任何好处就足够了?
redux-thunk
允许您的动作创建者 return 一个函数:
function myAction(payload){
return function(dispatch){
// use dispatch as you please
}
}
redux-promise
允许他们 return 一个承诺 :
function myAction(payload){
return new Promise(function(resolve, reject){
resolve(someData); // redux-promise will dispatch someData
});
}
如果您需要异步或有条件地分派操作,这两个库都很有用。 redux-thunk
还允许您在一个动作创建者中分派多次。选择一个、另一个还是两者都完全取决于您的 needs/style.
您很可能 want/need 在您的应用中同时使用这两者。 从 redux-promise 开始,用于常规的 promise 生成异步任务,然后随着复杂性的增加向上扩展以添加 Thunk(或 Sagas 等):
- 如果生活很简单,而您只是与 return 一个承诺的创作者进行基本的异步工作,那么
redux-promise
将改善您的生活并简化生活,快速而轻松。 (简而言之,您不需要考虑 'unwrapping' 您的承诺,然后 writing/dispatching 结果,redux-promise(-middleware) 会为您处理所有这些无聊的事情。)
- 但是,当出现以下情况时,生活会变得更加复杂:
- 也许您的 action creator 想要产生多个 promise,您希望将它们作为单独的 action 分派给单独的 reducer?
- 或者,在决定如何以及在何处发送结果之前,您需要管理一些复杂的预处理和条件逻辑?
在这些情况下,redux-thunk
的好处是它允许您将复杂性封装在动作创建器中。
但请注意,如果您的 Thunk 生成并分发 promise,那么您需要同时使用这两个库:
- Thunk 会编写原始动作并发送它们
redux-promise
然后将在 reducer 处处理由您的 Thunk 生成的单个 promise 的解包,以避免随之而来的样板文件。 (你 可以 而不是在 Thunks 中做所有事情, promise.then(unwrapAndDispatchResult).catch(unwrapAndDispatchError)
... 但你为什么要这么做?)
另一种总结用例差异的简单方法:Redux 操作周期的开始与结束:
- Thunk 用于 Redux 流程的开始:如果您需要创建一个复杂的动作,或者封装一些粗糙的动作创建
逻辑,让它远离你的组件,绝对远离减速器。
redux-promise
用于 end
你的流程,一旦一切都归结为简单的承诺,你只想打开它们并将它们的 resolved/rejected 值存储在商店中
NOTES/REFS:
- 我发现
redux-promise-middleware
是对原始 redux-promise
背后想法的更完整和更易于理解的实现。它正在积极开发中,并且 redux-promise-reducer
也得到了很好的补充。
- 还有其他类似的中间件可用于 composing/sequencing 您的复杂操作:一个非常流行的中间件是
redux-saga
,它与 redux-thunk
非常相似,但基于以下语法生成器函数。同样,您可能会将其与 redux-promise
. 结合使用
- 这里是 great article 直接比较各种异步组合选项,包括 thunk 和 redux-promise-middleware。 (TL;DR:"Redux Promise Middleware reduces boilerplate pretty dramatically vs some of the other options" ... "I think I like Saga for more complex applications (read: "使用”),和 Redux Promise 中间件用于其他一切。 ")
- 请注意,有一种重要情况,您可能认为需要分派多个操作,但实际上不需要,您可以让简单的事情保持简单。这就是您只希望多个 reducer 对您的异步调用做出反应的地方。但是,完全没有理由说明为什么多个 reducer 不能监控单个操作类型。您只是想确保您的团队知道您正在使用该约定,所以他们不要假设只有一个减速器(具有相关名称)可以处理给定的操作。
完全披露:我对 Redux 开发还比较陌生,自己也在为这个问题苦苦挣扎。我将解释我找到的最简洁的答案:
ReduxPromise returns 在分派操作时将承诺作为有效负载,然后 ReduxPromise 中间件会解析该承诺并将结果传递给 reducer。
另一方面,ReduxThunk 强制操作创建者推迟实际将操作对象分派给 reducer,直到调用分派。
这是我在其中找到此信息的教程的 link:https://blog.tighten.co/react-101-part-4-firebase。
据我所知,如果我错了请纠正我,redux-thunk is a middleware which helps us dispatch async function and debug values in the action itself while when I used redux-promise我无法在不实现我自己的机制的情况下创建异步函数,因为 Action 会抛出仅调度普通对象的异常。
这两个软件包之间的主要区别是什么?在单页 React 应用程序中同时使用这两个包或坚持使用 redux-thunk 是否有任何好处就足够了?
redux-thunk
允许您的动作创建者 return 一个函数:
function myAction(payload){
return function(dispatch){
// use dispatch as you please
}
}
redux-promise
允许他们 return 一个承诺 :
function myAction(payload){
return new Promise(function(resolve, reject){
resolve(someData); // redux-promise will dispatch someData
});
}
如果您需要异步或有条件地分派操作,这两个库都很有用。 redux-thunk
还允许您在一个动作创建者中分派多次。选择一个、另一个还是两者都完全取决于您的 needs/style.
您很可能 want/need 在您的应用中同时使用这两者。 从 redux-promise 开始,用于常规的 promise 生成异步任务,然后随着复杂性的增加向上扩展以添加 Thunk(或 Sagas 等):
- 如果生活很简单,而您只是与 return 一个承诺的创作者进行基本的异步工作,那么
redux-promise
将改善您的生活并简化生活,快速而轻松。 (简而言之,您不需要考虑 'unwrapping' 您的承诺,然后 writing/dispatching 结果,redux-promise(-middleware) 会为您处理所有这些无聊的事情。) - 但是,当出现以下情况时,生活会变得更加复杂:
- 也许您的 action creator 想要产生多个 promise,您希望将它们作为单独的 action 分派给单独的 reducer?
- 或者,在决定如何以及在何处发送结果之前,您需要管理一些复杂的预处理和条件逻辑?
在这些情况下,redux-thunk
的好处是它允许您将复杂性封装在动作创建器中。
但请注意,如果您的 Thunk 生成并分发 promise,那么您需要同时使用这两个库:
- Thunk 会编写原始动作并发送它们
redux-promise
然后将在 reducer 处处理由您的 Thunk 生成的单个 promise 的解包,以避免随之而来的样板文件。 (你 可以 而不是在 Thunks 中做所有事情,promise.then(unwrapAndDispatchResult).catch(unwrapAndDispatchError)
... 但你为什么要这么做?)
另一种总结用例差异的简单方法:Redux 操作周期的开始与结束:
- Thunk 用于 Redux 流程的开始:如果您需要创建一个复杂的动作,或者封装一些粗糙的动作创建 逻辑,让它远离你的组件,绝对远离减速器。
redux-promise
用于 end 你的流程,一旦一切都归结为简单的承诺,你只想打开它们并将它们的 resolved/rejected 值存储在商店中
NOTES/REFS:
- 我发现
redux-promise-middleware
是对原始redux-promise
背后想法的更完整和更易于理解的实现。它正在积极开发中,并且redux-promise-reducer
也得到了很好的补充。 - 还有其他类似的中间件可用于 composing/sequencing 您的复杂操作:一个非常流行的中间件是
redux-saga
,它与redux-thunk
非常相似,但基于以下语法生成器函数。同样,您可能会将其与redux-promise
. 结合使用
- 这里是 great article 直接比较各种异步组合选项,包括 thunk 和 redux-promise-middleware。 (TL;DR:"Redux Promise Middleware reduces boilerplate pretty dramatically vs some of the other options" ... "I think I like Saga for more complex applications (read: "使用”),和 Redux Promise 中间件用于其他一切。 ")
- 请注意,有一种重要情况,您可能认为需要分派多个操作,但实际上不需要,您可以让简单的事情保持简单。这就是您只希望多个 reducer 对您的异步调用做出反应的地方。但是,完全没有理由说明为什么多个 reducer 不能监控单个操作类型。您只是想确保您的团队知道您正在使用该约定,所以他们不要假设只有一个减速器(具有相关名称)可以处理给定的操作。
完全披露:我对 Redux 开发还比较陌生,自己也在为这个问题苦苦挣扎。我将解释我找到的最简洁的答案:
ReduxPromise returns 在分派操作时将承诺作为有效负载,然后 ReduxPromise 中间件会解析该承诺并将结果传递给 reducer。
另一方面,ReduxThunk 强制操作创建者推迟实际将操作对象分派给 reducer,直到调用分派。
这是我在其中找到此信息的教程的 link:https://blog.tighten.co/react-101-part-4-firebase。