promise,await,async,generator(4)(一天一个问题17)

generator

参照https://www.jianshu.com/p/83da0901166f

1.传统实现异步的方式是回调函数
2.promise链式调用实现异步
3.Generator正是以一种看似顺序、同步的方式实现了异步控制流程,增强了代码可读性

Generator(生成器)是一类特殊的函数,跟普通函数声明时的区别是加了一个*号
// 声明方式一(个人比较偏向这种风格啦)
function *main() {
    // do something……
}

// 声明方式二
function* main() {
    // do something
}
消息传递
function *main() {// 首先声明一个生成器函数
    let x = yield "starting";
    let y = yield (x * 2);

    console.log(x, y);
    return x + y;
}
let it = main();// 构造处一个迭代器it
let res = it.next(); // 第一个next()用于启动生成器,遇到yield暂停,相当于return,it.next()得到一个对象,对象的value值就是yield后面的值
console.log(res.value);  // 输出"starting" 

res = it.next(5); // 将第一个yield替换掉 let x = 5;再往下执行,遇到下一个yield暂停
console.log(res.value); // 输出10 

res = it.next(20); // let y = 20;往下执行,将第二个yield表达式替换成20 
console.log(res.value); // 输出25  (return ...的值传给了next(20)运行后的对象)

解读:
it.next()运行第一个yield(return),暂停同是it.next()得到一个对象,对象.value()值等于yield后面的东西
it.next(5),5将第一个yield替换掉,继续往下执行 let x = 5,遇到第二个yield暂停同时it.next()得到一个对象,对象.value()值等于yield后面的东西
res = it.next(20),将第二个yield替换掉,let y = 20,运行return,return的值会给赋给res.value
最后一个next()执行完毕之后,得到的值是函数return出来的值,如果函数没有自己加return语句,一样也会默认return undefined;

生成器函数;Iterator(迭代器);next();yield
yield语句可以在生成器函数内部暂停代码的执行使其挂起,此时生成器函数仍然是运行并且是活跃的,其内部资源都会保留下来,只不过是处在暂停状态。
在迭代器上调用next()方法可以使代码从暂停的位置开始继续往下执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值