Redux Thunk和Redux Saga有什么区别?

16 浏览
0 Comments

Redux Thunk和Redux Saga有什么区别?

Redux Thunk和Redux Saga都是Redux的中间件。两者之间的区别是什么,如何确定何时使用Redux Thunk或Redux Saga?

admin 更改状态以发布 2023年5月21日
0
0 Comments

实际上,它们都是用于处理异步操作的Redux中间件。如要了解它们之间的区别,请注意以下图片:

Redux架构图

中间件箱通常是指将现有软件中的不同功能组合到一起的软件服务。对于Redux,中间件提供了一个第三方扩展点,位于将操作派发和将操作移交给reducer之间。随后reducer生成新状态。

Redux Thunk是一种中间件,它使您可以调用返回函数而不是操作对象的操作创建者。该函数接收存储库的dispatch方法,然后在函数体内使用该方法在异步操作完成后调度常规同步操作。它简单易学,占用352B。

Redux Saga利用了称为GeneratorsES6特性,使我们能够编写看起来同步的异步代码,并且非常易于测试。在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));
    }
  };
};

0
0 Comments

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还要容易使用)。

0