一分钟学完function*和yield:简单使用和应用场景

前言

众所周知,es6中有一个没人用的新特性,yield+Generator
最近在学习File System Acess API的时候在官方文档中看到了function* 的异步写法,从来没有用过这种写法,去MDN学习了一下

使用方式

废话不多说,直接上代码

function* test(x){
    yield x
    y = yield 2
    yield fun(y)
}

function fun(x){
    return x
}

let a = test(11)

a.next() // {value: 11, done: false}
a.next() // {value: 2, done: false}
a.next(333) // {value: 2, done: false} 结束了
a.next() // {value: undefined, done: true}
a.next() // {value: undefined, done: true}
a.next(123) // {value: undefined, done: true}
a.next(()=>{}) // {value: undefined, done: true}
a.next('asd') // {value: undefined, done: true}

一步一步看
我们通过function* 这种声明方式定义了一个生成器函数,返回一个Generator对象并赋值给a
当我们第一次调用a.next()时,执行了yield x,其实也就是相当于return,返回了{value: 11, done: false}
当我们第二次调用a.next()时,执行了yield 2,返回了{value: 2, done: false}
当我们第三次调用a.next(333)时,执行了y=333和yield fun(y),所以返回了{value: 2, done: false}
如果我们再调用a.next(),因为已经没有yield了,所以不管我们怎么调用,都是返回{value: undefined, done: true}
当然,这是最简单的用法,还有些高端(让人看不懂的 )玩法,就不在此介绍了(我也不会

使用场景

这玩意好像真的没什么大用…
而且写复杂了非常有可能让后续维护这段代码的人看不懂
我想了想,想到一个可能能用到的场景
比方说现在有一个步骤条,通过一次一次的点击依次调用fun1,fun2,fun3方法
正常来说,我们会在state里增加一个参数,去维护一个step,根据step来调用方法
但是我们也可以使用yield来实现

function* doStep(){
     yield fun1()
     yield fun2()
     yield fun3()
}

const myGenerator = doStep()

<Bottom onClick={()=>{myGenerator.next()}}>

总结

不推荐使用,除非你真的想用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值