节点光纤可以使用ES6生成器实现吗?

时间:2013-08-17 21:41:10

标签: node.js generator coroutine ecmascript-harmony node-fibers

维基百科建议coroutines can be implemented with generators。这是否意味着可以使用node-fibers实现ES6 generators

3 个答案:

答案 0 :(得分:3)

您是否在寻找https://github.com/visionmedia/co之类的内容?

来自自述文件:

var co = require('co');

co(function *(){
  var a = yield get('http://google.com');
  var b = yield get('http://yahoo.com');
  var c = yield get('http://cloudup.com');
  console.log(a.status);
  console.log(b.status);
  console.log(c.status);
})()

co(function *(){
  var a = get('http://google.com');
  var b = get('http://yahoo.com');
  var c = get('http://cloudup.com');
  var res = yield [a, b, c];
  console.log(res);
})()

有一个名为koa(http://koajs.com)的新网络框架就是基于此。

答案 1 :(得分:1)

我编写了一个名为wait.for的光纤包装器:https://github.com/luciotato/waitfor

然后我使用生成器编码了相同的功能https://github.com/luciotato/waitfor-ES6

您可以比较两者以了解Generators如何替换node-Fibers,但语法不同。

一个重要的区别,使得无法拥有相同的API, ES6的生成器体是用特殊语法实现的:function* 而node-fibers允许你使用任何js函数。

答案 2 :(得分:0)

tried to port a very small subset但失败了。关键是节点光纤的Fiber.yield()在光纤的调用堆栈中一直停止执行,而生成器的yield仅停止立即函数。虽然您可能能够实现类似行为的系统(如Task.js),但似乎无法实现与API兼容的实现。