有没有办法使Node.js流成为协同线。
例如Fibonacci数字流。
fibonacci.on('data', cb);
//The callback (cb) is like
function cb(data)
{
//something done with data here ...
}期望值
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查询结果等等。
也许是这样的
如果是的话,怎么做,为什么不可能,至少有可能吗?也许是一个愚蠢的问题:)
发布于 2016-09-10 15:42:08
如果您不想使用播音器(例如Babel)或等到async/await将其发送到Node.js,您可以使用生成器和承诺来实现它。
缺点是您的代码必须驻留在生成器中。
首先,您可以让一个助手接收一个流并返回一个函数,该函数在调用时返回流的下一个“事件”的承诺(例如data)。
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();
});
});
}
}当您不使用流时,它会暂停它,当您询问下一个值时,它会恢复它。
接下来,您有一个作为参数接收生成器的助手,每次它产生承诺时,它都会解析它并将其结果传递给生成器。
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助手运行它,如下所示:
run(function*() {
var nextFib = streamToPromises(fibonacci);
var n;
n = yield nextFib();
console.log(n);
n = yield nextFib();
console.log(n);
});run函数。run函数将解析承诺,并将其值传递给您自己的生成器。这就是它的要点。您还需要修改streamToPromises以检查其他事件(例如,end或error)。
https://stackoverflow.com/questions/39426849
复制相似问题