为什么 generator 忽略第一次 next 调用的参数值呢?
首先要理解几个基本概念。
- 执行生成器不会执行生成器函数体的代码,只是获得一个遍历器
- 一旦调用
next,函数体就开始执行,一旦遇到yield就返回执行结果,暂停执行 - 第二次
next的参数会作为第一次yield的结果传递给函数体,以此类推,所以第一次next调用的参数没用
Part I – 源码加注解
// 获得一个遍历器对象
const runner = gen(3);
console.log( runner.next(4) ); // { value: 3, done: false }
console.log( runner.next(5) ); // { value: 5, done: false }
console.log( runner.next(6) ); // { value: 14, done: true }
// 定义生成器
function* gen(x) {
/*
第一次调用 next(4) 开始执行,
但是参数 4 会被忽略掉,
请继续往下看。
*/
const y = yield x /*
遇到 yield 立即暂停,
所以第一次 next(4) 调用就结束了,
参数 4 也就因此被忽略掉了,
返回 { value: x, done: false }。
等待下一次调用 next(5) 恢复执行,
将参数 5 作为表达式 yield x 的结果赋值给 y 。
*/;
const z = yield y /*
遇到 yield 立即暂停,
返回 { value: y, done: false }
等待下一次调用 next(6) 恢复执行,
将参数 6 作为表达式 yield y 的结果赋值给 z 。
*/;
return x + y + z /*
遇到 return 结束运行,
返回 { value: x + y + z, done: true }
*/;
}
Part II – Babel 转换后的代码
"use strict";
var _marked = [gen].map(regeneratorRuntime.mark);
// 获得一个遍历器对象
var runner = ge 大专栏 为什么 generator 忽略第一次 next 调用的参数值呢?n(3);
console.log(runner.next(4)); // { value: 3, done: false }
console.log(runner.next(5)); // { value: 5, done: false }
console.log(runner.next(6)); // { value: 14, done: true }
// 定义生成器
function gen(x) {
var y, z;
return regeneratorRuntime.wrap(function gen$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return x;
case 2:
y = _context.sent;
_context.next = 5;
return y;
case 5:
z = _context.sent;
return _context.abrupt("return", x + y + z /*
遇到 return 结束运行,
返回 { value: x + y + z, done: true }
*/);
case 7:
case "end":
return _context.stop();
}
}
}, _marked[0], this);
}
为什么 generator 忽略第一次 next 调用的参数值呢?的更多相关文章
- 关于getsockname()/getpeername()函数第一次被调用得到0.0.0.0结果的说明
最近阅读UNIX网络编程第四章时,书本末尾介绍了两个函数getsockname()和getpeername(),可以用于获取服务器端和客户端的IP地址与端口,原本很简单的两个函数,过一眼即明白函数的用 ...
- Spring 缓存注解@Cacheable 在缓存时候 ,出现了第一次进入调用 方法 ,第二次不调用的异常
代码: @Override @Cacheable(value = CACHE_NAME, key = "'CartItemkey_'+#uId") public List<S ...
- getsockname()/getpeername()函数第一次被调用得到0.0.0.0结果
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen); getsockname() returns the cu ...
- RPC调用获取参数值
本文以 RPC 获取百度登录password加密值为例: 涉及的知识点有: 1.js调试,寻找加密代码 2. 浏览器本地代码替换 3. js自执行函数 4. 插桩 5. RPC 远程调用 6. pyt ...
- JavaScript中的Generator函数
1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...
- 深入解析js异步编程利器Generator
我们在编写Nodejs程序时,经常会用到回调函数,在一个操作执行完成之后对返回的数据进行处理,我简单的理解它为异步编程. 如果操作很多,那么回调的嵌套就会必不可少,那么如果操作非常多,那么回调的嵌套就 ...
- Generator函数语法解析
转载请注明出处: Generator函数语法解析 Generator函数是ES6提供的一种异步编程解决方案,语法与传统函数完全不同.以下会介绍一下Generator函数. 写下这篇文章的目的其实很简单 ...
- ECMAScript 6 入门 ----Generator 函数
本文转自:阮一峰老师的ECMAScript 6 入门,有时间可以看下评论! Generator 函数 简介 基本概念 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不 ...
- ES6新特性三: Generator(生成器)函数详解
本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改 ...
随机推荐
- ruoyi IpUtils
package com.ruoyi.common.utils; import java.net.InetAddress; import java.net.UnknownHostException; i ...
- Python语言学习:pyc是什么
一.pyc 1.PyCodeObject:是python编译器真正编译成的结果 当python程序运行时,编译的结果是保存在位于内存中的PyCodeObject中.当python程序运行结束时,pyt ...
- WPS隐藏文档修订显示的方法
- 解决 Win7 远程桌面 已停止工作的问题
Windows 7远程桌面登录时崩溃, 错误提示如下: 问题签名: 问题事件名称: APPCRASH 应用程序名: mstsc.exe 应用程序版本: 6.1.7601.18540 应用程序时间戳: ...
- Linux服务器性能查看命令
一.uptime命令 [root@#test~]# uptime15:26:42 up 101 days, 18:44, 3 users, load average: 0.18, 0.22, 0. ...
- JDBC常用驱动和语法汇总
A. Firebird url=jdbc:firebirdsql:[HOST_NAME]/[PORT:][FULL_PATH_TO_DATABASE_FILE] driver=org.firebird ...
- 吴裕雄--天生自然python学习笔记:python 创建和操作Firebase实时数据库
Fire base 是专为移动开发提供的后端服务平台, Firebase 数据库与传统数据库不同,它不是用数据表来存储数据, 而是用 Key . Value 的字典型结构来存储数据,所以它不仅 是轻量 ...
- 编译安装 logstash-output-jdbc
环境 mac https://github.com/theangryangel/logstash-output-jdbc logstash-plugin install logstash-output ...
- iOS 后台任务
首先开启后台任务 使用设置后台任务触发的时机 application.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIn ...
- <c:if >标签的坑!!
<c:if test="${trans.Transition}"> <input id="${trans.nextnode}" type=&q ...