首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

React-Redux-Saga实现原理

前言React-Redux-Saga是一个用于处理Redux异步操作中间件,它实现原理基于生成器函数(Generator Functions)和事件监听模式。...本文主题为 saga 实现原理,那么与其说 sage 实现原理,不如说在 saga 如何通过 yield 获取异步返回结果,在 React-Saga 如何通过 yield 获取到数据之前,我还是建议去把博主在...好了,废话不多了,首先来看几个示例,对应这几个案例分别说明了几个注意点,然后我们在实现 saga 通过 yield 获取异步数据底层实现代码,第一个示例如,定义了一个生成器函数, 这个函数保存了...这里就要强调一个注意点了,默认情况下并不会将 yield 执行结果赋值给某个变量,在生成器函数如果想给上一次 yield 对应变量赋值,那么就必须在下一次调用 next 时候给 next 传参,...,然后在通过拿到可迭代对象调用 next 方法将获取到方法,传递给上一次 yield 进行变量赋值,然后我们在自定义生成器函数 yield 当中就获取到异步数据了从而实现了 saga 在 yield

23650

redux-saga_pub culture

Saga后,react只负责数据如何展示,redux来负责数据状态和绑定数据到react,而Saga处理了大部分复杂业务逻辑。...TODO, 需要进一步验证) Javascript Generator 在使用Saga之前,建议先了解Javascript生成器,因为Saga副作用都是通过生成器来实现。...如何使用 redux-sage官方文档有很详细使用说明,这里只做简单上手说明。...也可以有第三个参数用来传递变量给方法。 call方法 call有些类似Javascriptcall函数, 不同是它可以接受一个返回promise函数,使用生成器方式来把异步变同步。...put方法 put就是reduxdispatch,用来触发reducer更新store 有什么弊端 目前在项目实践遇到一些问题: redux-saga模型理解和学习需要投入很多精力 因为需要用

1.4K10
您找到你想要的搜索结果了吗?
是的
没有找到

React-Redux-Saga

Redux-saga 简介redux-sagaredux-thunk 一样, 是一个 Redux 获取存储异步数据中间件redux-saga 可以直接拦截 dispatch 派发 action...undefined);export default store;我们可以利用传入生成器告诉 redux-saga, 需要拦截哪些 dispatch 派发 action,声明一下,至于什么是生成器可去查看一下博主...JS 流程框架与特性 标签里面会进行介绍什么是生成器,然后这个陌生问题就过,我们继续,创建 saga.js 在当中定义生成器代码,在生成器函数获取网络数据:import {takeEvery,...如上自定义函数已经获取到了网络数据,添加到 Redux 中保存是通过 Saga 提供 put 方法进行添加即可,在更改 store.js 告诉 saga 中间件生成器哪些通过 dispatch 派发...即可,但是如果我们想同时保存多个数据 , 那么我们就必须借助另外一个函数, all():saga.js:import {takeLatest, put, all} from 'redux-saga/effects'import

18430

【Web技术】639- Web前端单元测试到底要怎么写?

项目用到技术框架 该项目采用 react 技术栈,用到主要框架包括:react、 redux、 react-reduxredux-actions、 reselect、 redux-saga、 seamless-immutable...设计模式与结构分析 在这个场景设计开发,我们严格遵守 redux 单向数据流 与 react-redux 最佳实践,并采用 redux-saga 来处理业务流, reselect 来处理状态缓存,通过...中间 store 内容都是 redux 相关,看名称应该都能知道意思了。 具体代码请看这里:https://github.com/deepfunc/react-test-demo。...saga 是一种 es6 生成器函数 - Generator ,我们利用他来产生各种声明式 effects ,由 redux-saga 引擎来消化处理,推动业务进行。...这个测试用例步骤就是利用生成器函数一步步产生下一个 effect ,然后断言比较。 从上面的注释 3、4 可以看到, redux-saga 还提供了一些辅助函数来方便处理分支断点。

3K30

Taro 小程序开发大型实战(六):尝鲜微信小程序云(上篇)

在这篇⽂章,我们将使⽤微信小程序云作为我们后端,并讲解如何引入和实现 Redux 异步工作流来实现小程序端访问⼩程序云状态管理。...在循环内部,我们使用了 redux-saga 提供 effects helper 函数:take,它用于监听 LOGIN action,获取 action 携带数据。...注意 对生成器函数不了解同学可以看一下这篇文档:迭代器和生成器[13]。...SET_IS_OPENED:设置登录框开启/关闭信息 我们还从 redux-saga/effects 包中导入了必要函数: call:在 saga 函数调用其他异步/同步函数,获取结果 put:...类似 dispatch,用于在 saga 函数中发起 action take:在 saga 函数监听 action,并获取对应 action 所携带数据 fork:在 saga 函数无阻塞调用

2.2K20

13.1 函数变量

函数变量函数,我们可以看到也进行了变量使用,那函数变量函数变量到底有什么区别呢? 1.1....,在函数name输出jerry # 但是,在函数外部,我们重新打印name值,发现name值还是tom # # 此时:函数name是局部变量函数外部name是全局变量 # 如此诡异情况...函数变量隔离 如果函数没有通过global引入全局变量,但是在函数又使用了和全局变量相同名称 此时就会出现问题 name = "tom" def test(): # 这里只是想使用一下全局变量值...,首先描述一下错误出现条件 1.如果函数没有声明和全局变量名称一致局部变量函数中直接使用全局 变量值,不会出现错误 2.如果函数,一旦在任意位置定义了和全局变量名称一致局部变量函数...在局部变量声明定义之前使用这个名称变量,就会出现上述错误 这是因为,在函数,一旦声明变量并且赋值一个局部变量函数又没有通过 global引入同名全局变量,此时在函数只会存在局部变量~

1.4K20

JavaScript异步生成器函数

() => {} 生成器函数 function*() {} 异步生成器函数 async function*() {} 异步生成器函数非常特殊,因为你可以在异步生成器函数同时使用 await 和...异步生成器函数与异步函数生成器函数不同之处在于,它们不返回 promise 或迭代器,而是返回一个异步迭代器。...你第一个异步生成器函数 异步生成器函数行为类似于生成器函数生成器函数返回一个具有 next() 函数对象,调用 next() 将执行生成器函数直到下一个 yield。...不同之处在于异步迭代器 next() 函数返回了一个 promise。 下面是带有异步生成器功能 “Hello, World” 例子。...首先,在上面的示例,在 subscribe() 记录到控制台代码是响应式,而不是命令式。换句话说,subscribe() handler 无法影响异步函数主体代码,它仅对事件做出反应。

2.3K20

一文梭穿Vuex、Flux、ReduxRedux-saga、Dva、MobX

Store 模式 最简单处理就是把状态存到一个外部变量里面,比如:this.root.data,当然也可以是一个全局变量。...而 Reducer 是一个纯函数,对于相同输入,永远都只会有相同输出,不会影响外部变量,也不会被外部变量影响,不得改写参数。...redux-saga 采用了另外一种思路,它没有把异步操作放在 action creator ,也没有去处理 reductor,而是把所有的异步操作看成“线程”,可以通过普通action去触发它,当操作完成时也会触发...如果从没接触过 Generator 的话,看着下面的代码,给你个1分钟傻瓜式速成,函数加个星号就是 Generator 函数了,Generator 就是个骂街生成器,Generator 函数里可以写一堆...异步数据获取相关业务逻辑放在了单独 saga.js ,不再是掺杂在 action.js 或 component.js

5.4K10

Taro 小程序开发大型实战(七):尝鲜微信小程序云(下篇)

在循环内部,我们使用了 redux-saga 提供 effects helper 函数:take,它用于监听 CREATE_POST action,获取 action 携带数据。...如果创建帖子成功,我们使用 redux-saga 提供 effects helpers 函数:put,put 类似之前在 view dispatch 操作,,来 dispatch 了三个 action...以及一些 redux-saga/effects 相关 helper 函数,我们已经在之前内容详细讲过了,这里就不再赘述了。...在循环内部,我们使用了 redux-saga 提供 effects helper 函数:take,它用于监听 GET_POSTS action,获取 action 携带数据。...在循环内部,我们使用了 redux-saga 提供 effects helper 函数:take,它用于监听 GET_POST action,获取 action 携带数据,这里我们拿到了传过来

2.6K10

深入理解 redux 数据流和异步过程管理

组件从 store 取数据,当交互时候去通知 store 改变对应数据。...但是 context 做为 store 有一个问题,任何组件都能从 context 取出数据来修改,那么当排查问题时候就特别困难,因为并不知道是哪个组件把数据改坏,也就是数据流不清晰。...通过 redux-thunk 中间件,我们可以把异步过程通过函数形式放在 dispatch 参数里: const login = (userName) => (dispatch) => { dispatch...然后 task 会调用不同实现函数来执行该 worker saga。 为什么要这样设计呢?直接执行不就行了,为啥要拆成 worker saga 和 task 两部分,这样理解成本不就高了么?...那么具体怎么执行就可以随意切换了,这样测试时候只需要模拟传入对应数据,就可以测试 worker saga 了。

2.4K10

状态管理概念,都是纸老虎

Store 模式 最简单处理就是把状态存到一个外部变量里面,比如:this.root.data,当然也可以是一个全局变量。但是这样有一个问题,就是数据改变后,不会留下变更过记录,这样不利于调试。...而 Reducer 是一个纯函数,对于相同输入,永远都只会有相同输出,不会影响外部变量,也不会被外部变量影响,不得改写参数。...redux-saga 采用了另外一种思路,它没有把异步操作放在 action creator ,也没有去处理 reductor,而是把所有的异步操作看成“线程”,可以通过普通action去触发它,当操作完成时也会触发...如果从没接触过 Generator 的话,看着下面的代码,给你个1分钟傻瓜式速成,函数加个星号就是 Generator 函数了,Generator 就是个骂街生成器,Generator 函数里可以写一堆...和 redux-thunk 等其他异步中间件对比来说,redux-saga 主要有下面几个特点:异步数据获取相关业务逻辑放在了单独 saga.js ,不再是掺杂在 action.js 或 component.js

5.2K20

redux-saga

作为一个Redux中间件,想让Redux应用副作用(即依赖/影响外部环境不纯部分)处理起来更优雅 二.设计理念 Saga像个独立线程一样,专门负责处理副作用,多个Saga可以串行/并行组合起来,...P.S.关于generator与iterator关系及generator基础用法,可以参考generator(生成器)_ES6笔记2 例如: const ts = Date.now(); function...所以添一层描述对象来解决这个问题,测试case可以简单比较描述对象,实际起作用Promise由redux-saga内部生成 这样做好处是单测不用mock异步方法(一般单测中会把所有异步方法替换掉...术语Saga指的是一系列操作集合,是个运行时抽象概念 redux-sagaSaga形式上是generator,用来描述一组操作,而generator是个具体静态概念 P.S.redux-saga...里所说Saga大多数情况下指都是generator形式一组操作,而不是指redux-saga自身。

1.9K41

手写Redux-Saga源码

本文全部代码参照官方源码写成,函数名字和变量名字尽量保持一致,写到具体方法时候我也会贴出对应代码地址,主要代码都在这里:github.com/redux-saga/… 先来看看我们用到了哪些API...currentTakers = []; // 一个变量存储我们所有注册事件和回调 // 保存事件和回调函数 // Redux-Saga里面take接收回调cb和匹配方法matcher...这里我们先实现take,takeEvery是在这个基础上实现Redux-Saga这块代码是单独抽取了一个文件,我们仿照这种做法吧。...官方文档这种写法反而很好理解,我这里采用文档这种写法: export function takeEvery(pattern, saga) { function* takeEveryHelper...Redux-Saga增强了Reduxdispatch函数,在dispatch同时会触发channel.put,也就是让Redux-Saga也响应回调。

1.7K30

前端实现异步几种方式_redux是什么

redux-saga功能也是一样,参见下图: 左边蓝圈圈里就是一堆saga,它们需要和外部进行异步I/O交互,等交互完成后再修改Store状态数据。...redux-saga就是一个帮你管理这堆saga管家,那么它跟其他中间件实现有什么不同呢?它使用了ES6Generator函数语法。...5.redux-saga用法 根据上一节分析,我们不仅需要实现一个Generator函数,还需要提供一个外部驱动函数。...但是这样的话不好做模拟(mock)测试:我们在测试过程,一般不会真的执行异步任务,而是替换成一个假函数。实际上,我们只需要确保yield了一个正确函数,并且函数有着正确参数。...因此,相比于直接调用异步函数,我们可以仅仅 yield 一条描述函数调用指令,由redux-saga中间件负责解释执行该指令,并在获得结果响应时恢复Generator执行。

1.7K30

React:几个入门小Demo

应用入口JS:index.js TodoApp 使用 Redux 管理应用状态,index.js作为应用入口,创建了ReduxStore并通过Provider接口将Store扩展到整个应用范围; #...AntDesign(蚂蚁金服React UI库) redux-saga 管理异步逻辑 react-router、react-router-redux 管理应用路由 使用了 ES6 decorator...配置Webpack UserCURD 使用 JSON-Server 模拟了一个后台数据服务器,所以需要将与数据处理相关HTTP请求中转到 JSON-Server 服务器上; ? 3.4....总体架构 应用所有异步逻辑(请求数据、删除数据等)由redux-saga集中管理、应用所有状态变化则由redux集中管理;借助这种结构,我们可以将应用“状态变化”和“异步”这两个概念清晰分离开...看一个Reducer reducer只用于处理应用状态改变,异步逻辑应写在saga; ## src/reducer/userEdit.js ? C. 看一个Saga Saga有2大特性: 1.

2.7K50

2022社招React面试题 附答案

Redux 异步请求怎么处理 可以在 componentDidmount 中直接进⾏请求⽆须借助redux。...action时,该action函数体会自动执行 store.dispatch(action)}复制代码 (2)使用redux-saga中间件 redux-saga优点: 异步解耦: 异步操作被被转移到单独...saga.js ,不再是掺杂在 action.js 或 component.js action摆脱thunk function: dispatch 参数依然是⼀个纯粹 action (FSA...功能强⼤: redux-saga提供了⼤量Saga 辅助函数和Effect 创建器供开发者使⽤,开发者⽆须封装或者简单封装即可使⽤ 灵活: redux-saga可以将多个Saga可以串⾏/并⾏组合起来...Redux 状态管理器和变量挂载到 window 中有什么区别 两者都是存储数据以供后期使用。

2K50
领券