- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我很确定我对生成器的理解天生就被打破了。所有在线资源似乎都相互冲突,这使得学习体验非常困难和困惑。
据我了解,yield
关键字使当前正在执行的代码块等待一个值,而不是在回调中抛出剩余的代码来执行。所以,正如大多数教程所指出的,你可以使用这个:
(function *() {
// Wait until users have be got and put into value of `results`
var results = yield db.get("users");
// And continue
view.display(results);
})();
代替:
db.get("user", function(results) {
view.display(results);
});
好吧,在我尝试编写自己的生成器之前,一切都很好。我遇到了几个问题:
.next
,对吗?yield
似乎代表 等待值 最常见的用例,而在实现部分(阅读:返回值到/内部 db.get
) yield
似乎代表将此值发送回当前等待的 block 以恢复执行。举个例子:
function *fn() {
yield 1;
yield "a";
}
var gen = fn();
gen.next(); // 1
gen.next(); // "a";
yield
在该上下文中是向下发送值而不是等待结果。在上面的第一个示例中,它等待来自 db.get
的结果并恢复执行,而不是“返回”或发回一个值。如果 db.get
情况为真,这不是天生同步的吗?我的意思是,它不完全一样:
(function() {
//Wait for the results
var results = fs.readFileSync("users.txt");
// Use results
view.display(results);
})();
不幸的是,如果从这个问题中可以清楚地看出(可能是唯一清楚的)就是我不了解生成器。希望我能在这里得到一些见解。
最佳答案
TL;DR:生成器的本质是控制代码执行的暂停。
生成器本身可以引用this .
总而言之,您应该区分三个组件:1.生成器函数2.发电机3. 生成结果
Generator 函数只是一个 function
,其头部带有星号,(可选)yield
在其主体中。
function *generator() {
console.log('Start!');
var i = 0;
while (true) {
if (i < 3)
yield i++;
}
}
var gen = generator();
// nothing happens here!!
Generator 函数本身只返回一个生成器,在上面的例子中,gen
。这里没有控制台输出,因为只有在返回的 generator 的 next
方法被调用后 generator function 的主体才会运行。Generator 有几种方法,其中最重要的一种是next
。 next
运行代码并返回生成器结果。
var ret = gen.next();
// Start!
console.log(ret);
// {value: 0, done: false}
ret
上面是生成器结果。它有两个属性:value
,你在generator function中产生的值,和done
,一个标志generator function 返回。
console.log(gen.next());
// {value: 1, done: false}
console.log(gen.next());
// {value: 2, done: false}
console.log(gen.next());
// {value: undefined, done: true}
在这一点上,没有人会期望你了解生成器,至少不了解生成器的异步功能。
简单来说,生成器有两个特点:
在代码中,yield
跳转到函数外,next(val)
跳转回函数并将值传回函数。外部代码可以处理异步调用并决定适当的时间切换到您自己的代码。
再次查看示例:
var gen = generator();
console.log('generated generator');
console.log(gen.next().value);
// mock long long processing
setTimeout(function() {
console.log(gen.next().value);
console.log('Execute after timer fire');
}, 1000);
console.log('Execute after timer set');
/* result:
generated generator
start
0
Execute after timer set
1
Execute after timer fire
*/
看到了吗?生成器函数本身不处理回调。外部代码可以。
基地在这里。您可以详细说明此代码以支持完全异步,同时保持生成器功能类似于同步功能。
例如,假设 geturl
是一个异步调用,它返回一个 promise
对象。你可以写 var html = yield getUrl('www.stackoverflow.com');
这会跳出你的代码。外部代码会执行以下操作:
var ret = gen.next();
ret.then(function (fetchedHTML) {
// jumps back to your generator function
// and assign fetchHTML to html in your code
gen.next(fetchedHTML);
});
关于Javascript 生成器 : Understanding them,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768922/
我使用以下代码和嵌套生成器迭代文本文档并使用 get_train_minibatch() 返回训练示例。我想保留( pickle )生成器,这样我就可以回到文本文档中的相同位置。但是,您不能 pick
在本教程中,您将借助示例了解 JavaScript 生成器。在 JavaScript 中,生成器提供了一种使用函数和迭代器的新方法。 使用生成器, 您可以从函数内部的任何位置停止执行函数 并从
LESS is very cool .我一直想知道是否有任何好的 html 生成器可以让我更轻松地编写表单或做其他事情。除了 html,是否有一些类似的东西? 最佳答案 已尝试 Haml ? 从它的网
前言 如果是做python或者其他语言的小伙伴,对于生成器应该不陌生。但很多php开发者或许都不知道生成器这个功能,可能是因为生成器是php 5.5.0才引入的功能,也可以是生成器作用不是很明显。
我正在尝试编写一个使用生成器语法生成日期时间列表的函数: let dateRange = let endDate = System.DateTime.Parse("6/1/2010")
我遇到了一些看起来像的代码: [func(val) for val in iterable] 有一个可迭代对象(在我的例子中是一个生成器),用户想要为其副作用调用每个值的函数(例如 func 可以只是
Delphi 有内置的东西来生成 UUID 吗? 最佳答案 program Guid; {$APPTYPE CONSOLE} uses SysUtils; var Uid: TGuid; Result
我正在深入研究 javascript 生成器,但我真的很困惑。 我使用 node@0.11.x 运行此示例: function find() { process.nextTick(functi
有人知道一些关于如何为 hibernate 创建自定义 ID 生成器的好教程吗? 最佳答案 在 Google 上粗略搜索“hibernate 自定义 id 生成器教程”发现了以下可能性。我排除了那些看
我正在关注 Python 大师 David Beazley 的幻灯片。它指出“生成器也用于并发。这是一个示例: from collections import deque def countdown(
我有一个生成事件的生成器,我想用可以从 API 获取的附加元数据来丰富它。 某些事件具有与其链接的对象 ID,而其他事件则具有对象的哈希值,但不能同时具有两者。我无法根据哈希获取对象 id,我只能执行
假设我有一个自定义类: public class CustomClass { private String name; private String data; public
我正在考虑实现一个函数来在 SQL 请求中“构建”WHERE 子句,如下所示: "SELECT * FROM table $where" 使用如下所示的循环构建 $where: $arr=array(
我正在寻找执行此操作的标准函数: def Forever(v): while True: yield v 这看起来太琐碎了,我不敢相信没有标准版本。 就此而言,有人知道指向所有标准生成器函
我知道这个网站上有几个非常相似的相关问题,但是在看了这部剧之后,我相信这个问题本身就是独一无二的。如果有人能找到并提供证据证明我的问题完全被骗了,我会自己撤回它(所以请不要否决这个!)。 我是 Jav
void __fastcall TForm1::Button1Click(TObject *Sender) { int size = MemoEnter->GetTextLen() + 1;
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我试图在我的生成器的以下两个定义之间做出决定。哪个更好?哪个“更像 python ”?无论如何,有没有办法减轻每一个的缺点? def myGenerator1(howMany): result
我有一个 Python 生成器 lexg,它在每次迭代时生成一个列表。该代码似乎在传统的 for 循环意义上工作,即 for i in lexg(2,2): print(i) 产生: [2, 0] [
我希望这不会超出 Python 生成器的能力,但我想构建一个这样,每次调用该函数时,它都会返回下一分钟直到结束时间。 因此该函数读取开始时间和结束时间,并以分钟为单位返回时间,直到涵盖其间的所有时间。
我是一名优秀的程序员,十分优秀!