首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js流可以作为协同线吗?

Node.js流可以作为协同线吗?
EN

Stack Overflow用户
提问于 2016-09-10 14:06:49
回答 1查看 1K关注 0票数 2

有没有办法使Node.js流成为协同线。

例如Fibonacci数字流。

代码语言:javascript
复制
fibonacci.on('data', cb);
//The callback (cb) is like
function cb(data)
{
    //something done with data here ...
}

期望值

代码语言:javascript
复制
function* fibonacciGenerator()
{
    fibonacci.on('data', cb);
    //Don't know what has to be done further... 
};

var fibGen = fibonacciGenerator();
fibGen.next().value(cb);
fibGen.next().value(cb);
fibGen.next().value(cb);
.
.
.

从生成器中获取所需的数字。这里的Fibonacci数列只是一个例子,实际上流可以是任何文件、mongodb查询结果等等。

也许是这样的

  1. 使'stream.on‘函数成为一个生成器。
  2. 将产生值放入回调函数中。
  3. 获取生成器对象。
  4. 调用next并获取流中的下一个值。

如果是的话,怎么做,为什么不可能,至少有可能吗?也许是一个愚蠢的问题:)

EN

回答 1

Stack Overflow用户

发布于 2016-09-10 15:42:08

如果您不想使用播音器(例如Babel)或等到async/await将其发送到Node.js,您可以使用生成器和承诺来实现它。

缺点是您的代码必须驻留在生成器中。

首先,您可以让一个助手接收一个流并返回一个函数,该函数在调用时返回流的下一个“事件”的承诺(例如data)。

代码语言:javascript
复制
function streamToPromises(stream) {
  return function() {
    if (stream.isPaused()) {
      stream.resume();
    }

    return new Promise(function(resolve) {
      stream.once('data', function() {
        resolve.apply(stream, arguments);
        stream.pause();
      });
    });
  }
}

当您不使用流时,它会暂停它,当您询问下一个值时,它会恢复它。

接下来,您有一个作为参数接收生成器的助手,每次它产生承诺时,它都会解析它并将其结果传递给生成器。

代码语言:javascript
复制
function run(fn) {
  var gen = fn();
  var promise = gen.next().value;

  var tick = function() {
    promise.then(function() {
      promise = gen.next.apply(gen, arguments).value;
    }).catch(function(err) {
      // TODO: Handle error.
    }).then(function() {
      tick();
    });
  }

  tick();
}

最后,您可以在生成器中执行自己的逻辑,并使用run助手运行它,如下所示:

代码语言:javascript
复制
run(function*() {
  var nextFib = streamToPromises(fibonacci);

  var n;

  n = yield nextFib();
  console.log(n);

  n = yield nextFib();
  console.log(n);
});
  • 您自己的生成器将产生承诺,暂停其执行,并将控件传递给run函数。
  • run函数将解析承诺,并将其值传递给您自己的生成器。

这就是它的要点。您还需要修改streamToPromises以检查其他事件(例如,enderror)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39426849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档