Thunk
Thunk用于传名调用,即把参数放进一个临时函数中,再将这个临时函数传入函数体。
function (m){ |
x是参数,将其放进临时函数中,真正用需要的时候才调用,传入main函数中,典型的函数式编程思想。
在 JS 中,Thunk 函数替换的不是表达式,而是多参数函数,将其替换成单参数的版本,且只接受回调函数作为参数,实质是函数的柯里化。
function Thunk(fn){ |
仅仅是Thunk并没有多大用处,需要结合Generator进行流程管理。
Generator
生成器函数,返回一个迭代器Iterator对象,我们可以通过这个迭代器,手动地遍历相关的值、状态,保证正确的执行顺序。生成器函数有next方法。
通过next函数,可以执行对应的yield表达式,且next()函数还可以带参数,该参数可以作为上一次yield表达式的返回值,因为yield本身是没有返回值的,如果next()中不带参数,则yield每次运行之后的返回值都是为undefined
function* gen() { |
Generator函 大专栏 Thunk函数和Generator函数数只是返回一个指针,指向里面迭代的对象,一般情况下,需要我们主动触发next()来执行,所以仅仅只有Generator并不适合进行异步操作。
yield
关键字使生成器函数执行暂停,yield
关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return
关键字。yield
关键字实际返回一个IteratorResult
对象,它有两个属性,value
和done
。value
属性是对yield
表达式求值的结果,而done
是false
,表示生成器函数尚未完全完成。如果将可选值传递给生成器的
next()
方法,则该值将成为生成器当前yield
操作返回的值
Thunk 函数的自动流程管理
Thunk 函数真正的威力,在于可以自动执行 Generator 函数
function run(fn) { |
next 函数先将指针移到 Generator 函数的下一步(gen.next 方法),然后判断 Generator 函数是否结束(result.done 属性),如果没结束,就将 next 函数再传入 Thunk 函数(result.value 属性),否则就直接退出