Redux Thunk和Redux Saga有什么区别?
Redux Thunk和Redux Saga有什么区别?
Redux Thunk和Redux Saga都是Redux的中间件。两者之间的区别是什么,如何确定何时使用Redux Thunk或Redux Saga?
实际上,它们都是用于处理异步操作的Redux
中间件。如要了解它们之间的区别,请注意以下图片:
中间件箱通常是指将现有软件中的不同功能组合到一起的软件服务。对于Redux,中间件提供了一个第三方扩展点,位于将操作派发和将操作移交给reducer之间。随后reducer生成新状态。
Redux Thunk是一种中间件,它使您可以调用返回函数而不是操作对象的操作创建者。该函数接收存储库的dispatch方法,然后在函数体内使用该方法在异步操作完成后调度常规同步操作。它简单易学,占用352B。
Redux Saga利用了称为Generators
的ES6
特性,使我们能够编写看起来同步的异步代码,并且非常易于测试。在saga中,我们可以轻松测试我们的异步流程,并且我们的操作保持纯净。它很复杂,难以学习和理解,占用14kB,但可轻松地组织复杂的异步操作,并使其易于阅读。并且saga具有许多处理异步操作的有用工具。
提示:如果您无法理解它们之间的区别或理解redux-saga
流,但仍想拥有可读的代码并避免回调地狱,请使用async/await
使用redux-thunk
,我提供一个示例:
// simple usage of redux-thunk: export const asyncApiCall = values => { return dispatch => { return axios.get(url) .then(response =>{ dispatch(successHandle(response)); }) .catch(error => { dispatch(errorHandle(error)); }); }; }; // async/await usage of redux-thunk: export const asyncApiCall = values => { return async dispatch => { try { const response = await axios.get(url); dispatch(successHandle(response)); } catch(error) { dispatch(errorHandle(error)); } }; };
Redux Thunk和Redux Saga都处理副作用问题。
简单来说,对于最常见的情况(异步函数,特别是AJAX调用),Thunk允许Promise来处理它们,Saga使用Generator。
Thunk使用简单,Promise对许多开发者来说很熟悉,而Saga/Generator更加强大,但需要学习它们。
当Promise足够好用时,Thunk也很好,当你经常处理更复杂的情况时,Saga会给你提供更好的工具。
例如,当你在一个路线/视图中开始一个AJAX调用,然后用户移动到另一个视图时会发生什么?你可以放心地让reducer无论如何改变状态吗?Saga使得取消效果变得轻松,而Thunk需要你自己处理它,但解决方案不如利用Sage方便。
实际上,选择使用哪一个取决于项目(千篇一律)。
需要记住的一件事是,这两个中间件可以共存,所以你可以从Thunk开始,并在需要时引入Sagas(然后选择如何/什么用经验进行重构......这种解决方案特别适用于“学习项目”,最小可行产品等)。
总的来说,Sagas更强大,更易于测试,但它们引入了许多新概念,如果你还在学习其他技术(特别是Redux),这可能会让你有些不知所措。
具体而言,当处理简单而有效的Redux哲学(动作(文字对象)输入到reducer(纯函数))时,你可以使用较为受限但易于理解的Thunk(Promise.then().error()
),或使用需要你面对(强大)的概念,使用这些动作可以做更复杂的事情的Saga。
还值得一提的是,(redux-)observable有更复杂(并且更强大)的范例来处理副作用,以防你不熟悉它(如果你已经熟悉它,可能比学习Saga还要容易使用)。