• 在 saga 任务中,如果 yield 了一个普通数据,saga 不作任何处理,仅仅将数据传递给 yield 表达式(把得到的数据放到 next 的参数中),因此,在 saga 中,yield 一个普通数据没什么意义。

  • saga 需要你在 yield 后面放上一些合适的 saga 指令(saga effects),如果放的是指令,saga 中间件会根据不同的指令进行特殊处理,以控制整个任务的流程。

  • 每个指令本质上就是一个函数,该函数调用后,会返回一个指令对象,saga 会接收到该指令对象,进行各种处理

  • 一旦 saga 任务完成(生成器函数运行完成),则 saga 中间件一定结束

  • 指令前面必须使用 yield,以确保该指令的返回结果被 saga 控制

saga 指令

  • take 指令:【阻塞】监听某个 action,如果 action 发生了,则会进行下一步处理,take 指令仅监听一次。yield 得到的是完整的 action 对象
  • all 指令:【阻塞】该函数传入一个数组,数组中放入生成器,saga 会等待所有的生成器全部完成后才会进一步处理
  • takeEvery 指令:不断的监听某个 action,当某个 action 到达之后,运行一个函数。takeEvery 永远不会结束当前的生成器
  • delay 指令:【阻塞】阻塞指定的毫秒数
  • put 指令:用于重新触发 action,相当于 dispatch 一个 action
  • call 指令:【可能阻塞】用于副作用(通常是异步)函数调用
  • apply 指令:【可能阻塞】用于副作用(通常是异步)函数调用
  • select 指令:用于得到当前仓库中的数据
  • cps 指令:【可能阻塞】用于调用那些传统的回调方式的异步函数