saga的基础知识方面内容较多, 具体可参考官方文档或是网上其他资料, 此处只进行简单梳理.
saga提供了很多指令, 每个指令本质上就是一个函数, 该函数调用后, 会返回一个指令对象, saga会接收到该指令对象, 进行各种处理.
一旦saga任务完成(生成器函数运行完成), 则saga中间件一定结束
指令前面必须使用yield, 确保该指令的返回结果会被saga控制
常见saga指令:
- take: [阻塞] 监听某个action, 如果action发生了, 则会进行下一步处理, take指令仅监听一次. yield得到的是完整的action对象
- all: [阻塞] 该函数传入一个数组, 数组中放入生成器, saga会等待所有的生成器全部完成后才会进一步处理
- takeEvery: [不阻塞] 不断的监听某个actioin, 当某个action到达之后, 运行一个函数. takeEvery永远不会结束当前生成器
- delay: [阻塞] 阻塞指定的毫秒数
- put: [不阻塞] 用于重新出发action, 相当于dispatch一个action
- call: [可能阻塞] 用于副作用(通常是异步)函数调用
- apply: [可能阻塞] 用于副作用(通常是异步)函数调用
- select: [不阻塞] 用于得到当前仓库中的数据
- cps: [可能阻塞] 用于调用那些传统的回调方式的异步函数
- fork: [不阻塞] 用于开启一个新的任务, 该任务不会阻塞, 该函数需要传递一个生成器函数, fork返回了一个对象, 类型为Task
- takeLastest: [不阻塞] 功能和takeEvery一致, 但是会取消掉上一次任务
- cancel: [不阻塞] 用于取消一个或多个任务, 实际上, 取消的实现原理, 是利用generator.return. cancel可以不传递参数, 如果不传递参数, 则取消当前任务线
- cancelled: 判断当前任务线是否被取消掉
- race: [阻塞] 可以传递多个指令, 当其中任何一个指令结束后, 会直接结束, 与Promise.race类似. 返回的结果是最先完成的指令结果, 并且该函数会自动取消其他的任务
saga中间件的原理:
- 首先启动一个任务
- 当action触发时, 直接将action分发到下一个中间件
源码分析:
runSaga: 一个函数, 用于启动一个任务, 一个任务的本质是一个generator function, runSage在内部得到该函数的generator, 并控制生成器的每一次迭代.
saga中间件代码文件划分较多, 总代码行数较多, 具体代码见github仓库(包含整个redux和redux中间件相关的核心逻辑手写代码): 点击这里.
网友评论