美文网首页
源码学习之: 手写saga

源码学习之: 手写saga

作者: 风雅欢乐 | 来源:发表于2020-05-10 17:19 被阅读0次

    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中间件的原理:

    1. 首先启动一个任务
    2. 当action触发时, 直接将action分发到下一个中间件

    源码分析:

    runSaga: 一个函数, 用于启动一个任务, 一个任务的本质是一个generator function, runSage在内部得到该函数的generator, 并控制生成器的每一次迭代.

    saga中间件代码文件划分较多, 总代码行数较多, 具体代码见github仓库(包含整个redux和redux中间件相关的核心逻辑手写代码): 点击这里.

    相关文章

      网友评论

          本文标题:源码学习之: 手写saga

          本文链接:https://www.haomeiwen.com/subject/gryjnhtx.html