基础概念
使用 Saga 辅助函数
redux-saga
提供一些辅助函数,包装了一些内部方法,用来在一些特定的action
被发起到store
时派生任务。
这些辅助函数构建在低阶API之上,我们将会在高阶概念中看到这些函数是如何实现的。
第一个函数takeEvery
,是最常见的,它提供了类似redux-thunk的行为。
让我们通过下面的例子演示一下。每次点击Fetch
按钮,我们发起一个FETCH_REQUESTED
的action
。我们通过从服务器获取一些数据,来处理这个action
。
首先我们创建一个异步action
任务:
然后在每次 FETCH_REQUESTED
action 被发起时启动上面的任务。
在上面的例子中,takeEvery
允许多个 fetchData
实例同时启动。在某个特定时刻,尽管之前还有一个或多个 fetchData
尚未结束,我们还是可以启动一个新的 fetchData
任务,
如果我们只想得到最新那个请求的响应(例如,始终显示最新版本的数据)。我们可以使用 takeLatest
辅助函数。
和 takeEvery
不同,在任何时刻 takeLatest
只允许一个 fetchData
任务在执行。并且这个任务是最后被启动的那个。 如果已经有一个任务在执行的时候启动另一个 fetchData
,那之前的这个任务会被自动取消。
如果你有多个 Saga 监视不同的 action
,你可以用内置辅助函数创建很多观察者,就像用了 fork
来派生他们 (之后我们会讲到 fork
,现在就把它当作一个允许我们在后台启动多个 saga 的 Effect )。
声明式Effects
在redux-saga
中,Saga 是通过Generator
函数实现的。为了表达Saga的逻辑,我们从Generator
中产出纯 JavaScript 对象。我们将这些对象称为Effect
。Effect
是一个包含有待中间件解释的一些信息的对象。你可以将Effect
视为向中间件发出的执行某种操作(例如,调用某个异步函数、向store派发action等)的指令。
在Redux-Saga中,你可以使用redux-saga/effects
包中提供的函数来创建Effects,
Saga可以产出多种形式的Effects。最简单的方式是产出一个Promise。
例如,假设我们有一个Saga,它监听PRODUCTS_REQUESTED这个action,每当匹配到action时,它会启动一个从服务器上获取产品列表的任务。
发起 action 到 store
redux-saga 为此提供了另外一个函数 put
,这个函数用于创建 dispatch Effect
。
错误处理
最后更新于
这有帮助吗?