node.js是否支持yield?
有没有办法让发电机进入node.js?
我目前正在用callback来伪造它们,但是我必须记得检查我的generator函数内部的callback响应,这个函数创build了很多if (callback(arg) === false) return;
我想在Python中的东西:
for p in primes(): if p > 100: break do_something(p)
我正在做的节点是这样的:
primes(function(p) { if (p > 100) return false; do_something(p) });
也许像coffeescript可以帮助?
是的,从版本0.11开始。 请享用!
http://wingolog.org/archives/2013/05/08/generators-in-v8
http://jlongster.com/A-Study-on-Solving-Callbacks-with-JavaScript-Generators
答案是“目前不”,但马塞尔似乎是我的英雄。 让我们希望这是一个地方:
https://groups.google.com/forum/#!msg/nodejs/BNs3OsDYsYw/oCsWBw9AWC0J https://github.com/laverdet/node-fibers
您可以在Node.js中使用生成器,但只能使用0.11+。 Node.js 0.12(稳定)现在可用。 将--harmony_generators
或--harmony
添加到节点的命令行参数中以启用它。
借助Traceur ,您可以将高级JavaScript编译为vanilla JavaScript。 你可以为node.js制作一个装载器来实现这个function。 由于它运行并编译为vanilla JavaScript,因此它在node.js <0.11以及浏览器中运行。
Facebook已经开发了一个只支持发电机的轻型版本,被称为Regenerator 。 它与Traceur的工作方式类似。
显然不是在目前的稳定版本。 但是,您可以使用节点光纤+承诺实现相同的function。
这是我的实现:
var fiber = require('fibers'); module.exports.yield = function (promise) { var currentFiber = fiber.current; promise .then(function (value) { currentFiber.run(value); }) .otherwise(function (reason) { currentFiber.throwInto(reason); }); return fiber.yield(); }; module.exports.spawn = function (makeGenerator) { fiber(function () { makeGenerator.apply(this, Array.prototype.slice.call(arguments, 1)); }).run(); };
以及它如何工作的示例代码:(query.find返回一个承诺)
var generators = require('./utils/generators'); var query = require('./utils/query'); generators.spawn(function () { try { var field1 = generators.yield(query.find('user', { _id : '1' })); var field2 = generators.yield(query.find('user', { _id : '2' })); console.log('success', field1[0]._id, field2[0]._id); } catch (e) { console.error('error', e); } });
是和不是。
var myGen = (function () { var i = 0; return function () { i++; return i; } })(); var i; while ((i = myGen()) < 100 ) { do something; }
正如你所看到的,你可以使用闭包实现类似的东西,但是它没有本地生成器。
v8项目成员最近已经接受了v8中提出的发电机问题 。
请投票 ,让yield
成真。
2014年更新:Node现在支持callback。 以下是2010年的一篇文章。
你应该使用callback。 如果函数asynchronous执行某些操作,则可能还需要继续callback(继续是一个不好的字,因为它也意味着其他的东西,但是您明白了我的意思)。
primes(function(p) { if (p > 100) return false // i assume this stops the yielding do_something(p) return true // it's also better to be consistent }, function(err) { // fire when the yield callback returns false if (err) throw err // error from whatever asynch thing you did // continue... })
更新了示例代码
我把它翻转过来,以便它在完成时返回true(因为null,false和undefined都会计算为false)。
function primes(callback) { var n = 1, a = true; search: while (a) { n += 1; for (var i = 2; i <= Math.sqrt(n); i += 1) if (n % i == 0) continue search; if (callback(n)) return } } primes(function(p) { console.log(p) if (p > 100) return true })
我们在节点<0.11.3中使用gnode
生成器 – https://github.com/TooTallNate/gnode