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可以帮助?

答案是“目前不”,但马塞尔似乎是我的英雄。 让我们希望这是一个地方:

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