all([...effects]): 命令中间件并行的运行多个effects,并等待其全部完成,返回全部effcts结果。相当于Promise.all的行为。一般根saga文件都会使用该方法,即同时启动所有该项目所需要运行的saga任务. 其中分为两种情况:1,all中任务全部完成,则all所在Generator恢复执行。 2,all中某个任 务失败,则取消其他all中进行的任务,同时错误冒泡到all所在Generator中。
race([...effects]):创建一个Effect描述信息,命令中间件在多个任务间竞赛。且分两种情况:1,如果率先完成者正常完成,则取消其他未完成的任务,且完成任务结果时该任务return值,其他取消任务的结果均为undefined。 2,率先完成任务失败(抛错且未处理),则错误冒泡到race所在Generator函数中,且取消其他竞赛中的任务
cancel(...tasks): cancel中参数tasks是可选的,如果传参,可以传入一个或多个task,像这样cancel(task)||cancel(task1,task2,...tasks) ,其中task是由fork指令返回的Task对象,用于取消这些task对应的fork分叉任务。其中如果期望在这些fork任务被取消时执行一些取消逻辑可以将这些取消逻辑放在finally区块中。
takeEvery(pattern,saga,...args): 监听类型为pattern的action的派发,当监听到该类型的action,将执行第二个参数saga,且args将作为参数传递给saga函数,与takeLatest唯一不同即 不会取消之前监听到类型pattern的action且正在执行的saga任务。
-
pattern:takeLatest将监听类型为pattern的action的派发
-
saga:监听到对应action,启动对应saga。
-
args:传递给saga函数的参数。如果takeLatest没有传入args,那么saga函数的参数只有一个,即类型为pattern的action。如果takeLatest传入了其它args参数,那么saga函数的参数将像这样(...args,action)。
takeLatest(pattern,saga,...args): 监听类型为pattern的action的派发,当监听到该类型的action,将执行第二个参数saga,且如果存在上一次已经启动且仍在运行的该saga,takeLatest将取消上一次该saga的运行.
take(pattern) :take创建一个Effect,命令中间件等待指定action,在与pattern匹配action到来之前,当前take所在的Generator函数将暂停。所以这是个阻塞调用的方法。
call(fn,...args) :call创建一个Effect,用来命令中间件以参数args调用fn,其中fn可以是Generator函数,也可以是一个返回Promise或任意其他值的普通函数. 1.当fn是一个Generator或者Promise函数时,阻塞当前任务,待异步完成时返回 2.当fn是一个普通函数时,不会阻塞当前任务,会立即返回结果
fork(fn, ...args) : fork创建一个Effect,命令中间件以非阻塞的形式调用fn,且返回一个task对象,类似非阻塞形式的call。fork表现形式为创建一个分叉的task去执行fn(怎么像多线程),且fork所在的saga不会在等待fn返回结果的时候被中间件暂停,相反,它在fn被调用时便会立即恢复执行。注意:fork虽然是非阻塞的,但是它创建的分叉任务将附加到它的父级任务上,因此当分叉任务未完成时,即使父任务内其他代码执行玩,也会等待fork任务执行完毕,才会退出父任务
spawn(fn, ...args) :创建一个Effect,命令中间件以非阻塞的形式调用fn,该方法将创建一个完全独立的任务,该任务不会被附加到父任务上,区别于fork任务
delay(timeout,[val]): 产生一个阻塞的Effect(Effect=>任务单元),阻塞timeout毫秒,并返回val(val非必传)。大白话就是yield delay(1000,'Love U')将阻塞当前代码执行1000ms,并且返回'Love U'
put(action): 创建一个Effect,用来命令中间件向store发起该action,这个action是非阻塞的。相当于dispatch(action)。