ES6 Yield:第一次调用 next() 的参数会发生什么?

2023-11-30

考虑这段代码:

function foo(a) {
  console.log("Mul =", a);
  return a * 2;
};

function * process(start) {
  // next() #1
  var result = start;

  console.log("Pre-processing =", result);
  result = yield foo(result);
  // next() #2
  console.log("Process result 1 =", result);
  result = yield foo(result);
  // next() #3
  console.log("Process result 2 =", result);
  result = yield foo(result);
  // next() #4
  console.log("Process result 3 =", result);

  return foo(result);
}

var it = process(1);
console.log("#1");
console.log("Next 1 =", /*#1*/it.next("bar"));
console.log("#2");
console.log("Next 2 =", /*#2*/it.next(3));
console.log("#3");
console.log("Next 3 =", /*#3*/it.next(7));
console.log("#4");
console.log("Next 4 =", /*#4*/it.next(15));

和输出

#1
Pre-processing = 1
Mul = 1
Next 1 = { value: 2, done: false }
#2
Process result 1 = 3
Mul = 3
Next 2 = { value: 6, done: false }
#3
Process result 2 = 7
Mul = 7
Next 3 = { value: 14, done: false }
#4
Process result 3 = 15
Mul = 15
Next 4 = { value: 30, done: true }

为什么第一个电话是it.next()跳过参数(在上面的代码中,"bar")总共?或者,换句话说,为什么后续调用的行为会有所不同?我期望调用生成器函数会跳过参数,并且调用next()实际上会初始化迭代器,使过程更加连贯,不是吗?


草案中:

经过更多研究后,答案就在 Harmony 的草案中(参见 wiki:http://wiki.ecmascript.org/doku.php?id=harmony:generators#methodnext).

next应该没有争论。然而,似乎在呼唤next有一个参数就相当于调用send有一个论点。答案就在这里。send被设计为如果首先调用则抛出错误(不next prior).

所以基本上,你不应该能够通过传递参数来“初始化”你的迭代器next因为您无权这样做。

在实现中:

然而,这只是规范。总结一下作为评论所说的内容,至少有两个原因导致您无法将论点传递给您的第一个next并且必须将其传递给您的生成器。

第一个事实是您需要某种方法来实际获得这个参数。您不能像下次通话时那样进行操作let myVar = yield myValue.
第二个是next只接受一个参数,这是相当有限的,而在生成迭代器时,您可以将无限数量的参数传递给生成器。

然而,这只是目前正在发生的事情。没有任何内容表明草案或实施不会改变。我们当然可以想象send接受任意数量的参数(没有原因,但嘿,谁知道),并能够将其转换为生成器的参数。管他呢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES6 Yield:第一次调用 next() 的参数会发生什么? 的相关文章

  • JMeter无法使用插件打开JMeter文件

    当我尝试打开保存的 jmx 时出现错误 我的备份已经一周了 我尝试遵循类似的问题 但也无法使用 JMeter 3 1 加载它 我安装了新的 JMeter 3 2 并安装了所有可用插件的插件 但仍然收到错误 2017 08 30 10 03

随机推荐

  • 使用 NSNotificationCenter 向另一个类发送通知

    所以我的目标是使用以下命令向另一个班级发送通知NSNotificationCenter 我也想通过object并通知对方class 我该怎么做 您必须先注册一个通知名称 NSNotificationCenter defaultCenter
  • C 语言翻译的 8 个阶段的海报

    有没有人参考过海报 单页 pdf 或类似的内容 其中包含 C 语言翻译的八个阶段的列表 第一个阶段是三字母翻译 我想打印一张挂在电脑旁边的墙上 更新 抱歉忘记指定 我对 C90 感兴趣 虽然 C99 可能非常接近 Pragma正如 PMG
  • R:如何在 ggplotly 中自定义桑基图?

    我有按年份和型号划分的销售数据 可以通过以下方式可视化桑基图 现在我正在努力处理两个问题 首先我需要设置模型B多年来 无论其价值如何 总是处于闲聊的底部 当我通过重新可视化 ggplot 时ggplotly hover不显示销售额或年份 c
  • Jenkins 管道 ansicolor 控制台输出

    我知道可以使用 AnsiColor 插件在控制台输出中显示颜色 我测试了下面的基本示例 This shows a simple build wrapper example using the AnsiColor plugin node Th
  • Python 迭代器没有ext() 吗?

    Python 迭代器有吗hasnext method 捕捉的替代方案StopIteration是使用next iterator default value 例如 gt gt gt a iter hi gt gt gt print next
  • Android:如何写入SQL数据库

    我一直在尝试遵循 newBoston 教程 但当我单击按钮将数据写入数据库时 发现出现运行时错误 LogCat 显示 在活动中找不到方法 addModuleButton View 有什么建议么 添加模块活动 public class Add
  • 从另一个线程填充列表视图

    我试图从另一个类填充列表视图 但出现此错误 跨线程操作无效 控制 listView1 是从创建它的线程以外的线程访问的 在我的课堂上 我像这样声明我的列表视图 class CheckBlankPages public String pdfF
  • 使用#pragma warning push/pop 是暂时改变警告级别的正确方法吗?

    有时很难编写完全不发出警告的 C 代码 然而 启用警告是一个好主意 因此 通常有必要禁用某些特定构造的警告 并在所有其他代码片段中启用它们 到目前为止我已经看到了两种方法 第一个是使用 pragma warning push and pra
  • “main”函数的返回值去了哪里?

    在C语言中 一个函数always将其值返回给调用函数 而不是返回给其自身 如果返回类型不为 void Like int main 但是由于 main 函数是由操作系统调用 即不是一个函数 那么 main 函数返回值给谁呢 当使用表达式返回值
  • 在给定字符串中搜索字符集的最快算法

    这是我和我的一位朋友进行的一场辩论 制作一种验证方法来检查给定字符串是否具有不允许的字符之一的最快方法是什么 方法一 简单 char invalidChars toCharArray for int i 0 i lt myString le
  • 在 pandas 中按组填充缺失的日期

    我需要按组填写缺失的日期 这是创建数据框的代码 我只想将填充列的日期向下添加到填充列的日期更改时 并且仅直到组 名称 更改为止 data tdate 20080815 20080915 20081226 20090110 20090131
  • PHP无法通过python连接mysql

    我正在编写一个 PHP 来执行一个像这样连接到 mysql 的 python 脚本 在Python脚本中 coding utf 8 import mysql connector 并得到这个错误 回溯 最近一次调用最后一次 导入中的文件 do
  • 显示单元格的公式,但显示值而不是引用

    我正在使用公式在另一个单元格中显示单元格公式 我想显示这个公式中每个参考的值 而不是参考 Ex R 16 R19 T 15 R 16 想要它成为 3 2 4 2 我现在使用的函数来显示公式 Function GetFormula Cell
  • 聚合物select2元件

    我正在尝试包装很棒的 select2 jquery 小部件 https github com ivaynberg select2 在聚合物元素中以便于重复使用 我能够正确初始化选择 但在初始化后遇到问题 具体来说 当单击选择将其打开时 在定
  • 使用 gmaps4rails 显示多边形

    红宝石新手在这里 尝试使用 gmaps4rails gem 顺便说一句 很棒的 gem 在谷歌地图上将点列表显示为多边形 任何基于下面的代码示例的建议将不胜感激 我可以看到地图的轮廓 但看不到地图 也没有多边形 更新 此代码已更新 问题已解
  • 如何阻止 VS Code 在按 Enter 键时自动选择第一个建议?

    每当我在 flutter 代码中输入 Widget 函数并按 Enter 键时 VS Code 都会自动选择第一个参数建议 当我实际上想要在下一行输入该参数时 该参数会在同一行上输入 有没有办法在顶部添加一个空建议 以便我必须先按向下箭头才
  • 我需要 ($("#flip").click slipToggle ) 在同一页面上使用相同的

    我有一个使用 XSl 代码从 XML 读取的常见问题解答页面 问题和答案的 div 将重复与 XML 中的记录数一样多 这是 XSL 代码
  • android - 内存不足问题

    在我的应用程序中 我正在从网络下载图像 为此 我第一次从网络下载图像 这些图像存储在 SD 卡中 下次 我会检查这些图像是否在 SD 卡中 如果是 则从 SD 卡获取 否则我将从网络下载 这些图像像列表一样显示 我反复 意味着连续向上 向下
  • 设备和模拟器上的 Android LinkedIn 集成错误

    我正在尝试使用此问题答案集成 linkedIn从 Android 应用程序发布 LinkedIn 消息但这个给定的示例 LITest 无法在设备上工作 它向我显示了一些错误 如下所示 12 19 19 36 30 489 ERROR And
  • ES6 Yield:第一次调用 next() 的参数会发生什么?

    考虑这段代码 function foo a console log Mul a return a 2 function process start next 1 var result start console log Pre proces