Articles of 生成器

通过yield&co。获得承诺的价值

我试图找出如何通过yield来获得承诺的价值,可能与“合作”: function *(){ var someVar = yield functionThatReturnsAPromise(); } 被调用的函数不是一个生成器,只是一个正常的函数。 有了上面的一些someVar == Promise ,但我想要解决的价值。 公司或其他图书馆是否有办法做到这一点?

了解具有fs模块的Node JS生成器

我一直对Node JS非常兴奋。 我终于决定closures并编写一个testing项目,以了解Node最新的Harmony构build中的生成器。 这是我非常简单的testing项目: https://github.com/kirkouimet/project-node 要运行我的testing项目,您可以轻松地从Github中提取文件,然后运行它: node –harmony App.js 这是我的问题 – 我似乎无法让节点的asynchronousfs.readdir方法与内置的生成器运行。 其他项目,如银河和暂停似乎能够做到这一点。 这是我需要修复的代码块。 我想能够实例化FileSystemtypes的对象并调用其上的.list()方法: https://github.com/kirkouimet/project-node/blob/4c77294f42da9e078775bb84c763d4c60f21e1cc/FileSystem.js#L7-L11 FileSystem = Class.extend({ construct: function() { this.currentDirectory = null; }, list: function*(path) { var list = yield NodeFileSystem.readdir(path); return list; } }); 我需要提前做些什么来将节点的fs.readdir转换成一个生成器? 一个重要的注意事项是,我正在parsing创build的所有类函数。 这使我可以处理发电机的function,而不像普通的function https://github.com/kirkouimet/project-node/blob/4c77294f42da9e078775bb84c763d4c60f21e1cc/Class.js#L31-L51 这个项目我一直很难过。 会爱任何援助! 这是我想要完成的: 大量使用带有inheritance的John Resig的JavaScript Class支持修改版本的类 使用生成器获得对Node的asynchronous调用的内联支持 编辑 我试图实现你的例子function,我遇到了一些麻烦。 list: function*(path) { var […]

将invRegex.py移植到Javascript(Node.js)

我一直试图将invRegex.py移植到node.js实现一段时间,但我仍然在努力。 我已经有了正则expression式分析树,这要归功于ret.js标记器,它工作得很好,但是所有不同元素的实际生成和连接都是以内存效率的方式展现给我的。 为了简单起见,可以说我有以下的正则expression式: [01]{1,2}@[af] invRegex.py会产生下面的输出( tabbified占用更less的空间): 0@a 0@b 0@c 0@d 0@e 0@f 00@a 00@b 00@c 00@d 00@e 00@f 01@a 01@b 01@c 01@d 01@e 01@f 1@a 1@b 1@c 1@d 1@e 1@f 10@a 10@b 10@c 10@d 10@e 10@f 11@a 11@b 11@c 11@d 11@e 11@f 考虑到我能够获得每个单独的令牌并生成一个包含所有有效的单个输出的数组: [01]{1,2} = function () { return ['0', '00', '01', '1', '10', '11']; […]

发电机function与蓝鸟和coexpression

我正在尝试使用节点0.12中的一些和声function,特别是尝试使用新的生成器function。 我正在用co(v4),bluebird和express(v4)这样做,就像这样: // … var fs = bluebird.promisifyAll(require('fs')); // … app.post('/test', co.wrap(function* (req, res, next) { var contents = yield fs.readFileAsync('/etc/hosts', 'utf8'); return res.send(contents); })); // … 根据它的文档,co.wrap返回一个正常的函数,它返回给定生成器函数的promise。 到目前为止,这是工作正常,但我不知道的是,如果a)我通过不等待返回的承诺的结果泄漏内存和b)如果我可能会失去一个exception抛出我的生成器函数,或一它使用的模块。 这是一个好方法吗? 你看到有什么不对吗?

forEach在Node.js中使用生成器

我正在使用Koa.js框架和Mongoose.js模块。 通常从MongoDB得到一个结果我的代码是这样的: var res = yield db.collection.findOne({id: 'my-id-here'}).exec(); 但是我需要为名为'items'的数组的每个元素执行这一行。 items.forEach(function(item) { var res = yield db.collection.findOne({id: item.id}).exec(); console.log(res) // undefined }); 但是这个代码不能像yield中的函数那样运行。 如果我写这个: items.forEach(function *(item) { var res = yield db.collection.findOne({id: item.id}).exec(); console.log(res) // undefined }); 我也没有得到resvariables的结果。 我试图使用“ generator-foreach ”模块,但没有像这样工作。 我知道这是我对Node.js的语言素养缺乏了解。 但是,你们能帮我find办法吗?

为什么不从`.map`callback中产生回报?

学习生成器 – 4»捕获错误! 该解决scheme使用for loop但我只是找不到任何MDN – 迭代协议 ,指的是callback内的产量。 我会猜测答案就是don't do that但是如果有人有时间或倾向提供一个解释,请提前致谢! 码: function *upper (items) { items.map(function (item) { try { yield item.toUpperCase() } catch (e) { yield 'null' } } } var badItems = ['a', 'B', 1, 'c'] for (var item of upper(badItems)) { console.log(item) } // want to log: A, B, null, C […]

在JavaScript中实现monad

现在, node.js支持ECMAScript Harmony生成器,我们可以在Haskell中简洁地写出monadic代码: function monad(unit, bind) { return function (f) { return function () { var g = f.apply(this, arguments); return typeOf(g) === "Generator" ? send() : unit(g); function send(value) { var result = g.next(value); if (result.done) return unit(result.value); else return bind(result.value, send); } }; }; } function typeOf(value) { return Object.prototype.toString.call(value).slice(8, -1); } 在上面的代码中, […]

什么是ES6生成器,如何在node.js中使用它们?

今天我在一个node.js聚会上,有一个我在那里遇到的人说node.js有es6生成器。 他表示,这是一个比callback风格编程的巨大改进,并且会改变节点格局。 Iirc,他说了一些关于调用栈和exception的东西。 我查看了他们,但是还没有真正发现任何能够以一种对初学者友好的方式解释他们的资源。 什么是生成器的高级概述,和callback有什么不同(或更好?)? PS:如果你可以给出一段代码来突出显示常见场景(做一个http请求或数据库调用)的区别,那真的很有帮助。

asynchronous/等待和ES6产出与发电机之间的差异

我正在阅读这篇精彩的文章 – https://www.promisejs.org/generators/ 它清楚地突出了这个函数,它是处理生成器函数的辅助函数: function async(makeGenerator){ return function () { var generator = makeGenerator.apply(this, arguments); function handle(result){ // result => { done: [Boolean], value: [Object] } if (result.done) return Promise.resolve(result.value); return Promise.resolve(result.value).then(function (res){ return handle(generator.next(res)); }, function (err){ return handle(generator.throw(err)); }); } try { return handle(generator.next()); } catch (ex) { return Promise.reject(ex); } } } […]