事件侦听器callback的Node.js生成器函数

我正在尝试节点的生成器函数,并与事件侦​​听器callback使用时得到问题。 请检查我正在使用的代码

function* fileLineByLine(file){ var fs = require('fs'), readline = require('readline'); var rd = readline.createInterface({ input: fs.createReadStream(file), output: process.stdout, terminal: false }); yield rd.on('line') } console.log(fileLineByLine('test.csv').next()) 

任何人有一个想法?

你不能返回每一行。 节点readline是asynchronous的。 你可以使用thunk来获得价值,但是你仍然需要将callback传递给on方法。

一个可选的方法来做到这一点:

 //start is a thunk creator function start(cb){ var c = cb(); c.next(); //start up! return function(message){ c.next(message); }; } rd.on('line', start(function(message){ var m = yield message; console.log(m); })); 

有一个晚上想到,这里是要点: 包装readline的事件为基础的界面友好

它使用https://github.com/tj/co来驱动它。

TEST_CO-readline.js

 var co = require('co'), readline = require('./co-readline'); co(function* () { var hosts = readline('/etc/hosts'); while (true) { var line = yield hosts.read(); if (typeof(line) == 'string') { console.log('result line: ' + line); continue; } break; } }).then(function (value) { console.error("value: " + (value || '').toString()); }).catch(function (e) { console.error("catch: " + e.stack); }); 

共同readline.js

 var co = require('co'), assert = require('assert'); fs = require('fs'), readline = require('readline'); module.exports = function (filename) { var instance = { lines: [], closed: false, errored: null, callback: null, read: function () { return function (callback) { assert(instance.callback === null); if (instance.lines.length > 0) { var line = instance.lines.shift() callback(null, line); if (instance.lines.length === 0) { stream.resume(); } return; } else if (instance.closed) { return callback(null, null); } else if (instance.errored) { return callback(instance.errored); } instance.callback = callback; }; } }; var stream = readline.createInterface({ input: fs.createReadStream(filename) }); stream.on('line', function (line) { instance.lines.push(line); stream.pause(); if (instance.callback) { var callback = instance.callback; instance.callback = null; callback(null, instance.lines.shift()); if (instance.lines.length == 0) { stream.resume(); } return; } }).on('close', function () { instance.closed = true; if (instance.callback && instance.lines.length == 0) { var callback = instance.callback; instance.callback = null; return callback(null, null); } }).on('error', function (err) { instance.errored = err; if (instance.callback && instance.lines.length == 0) { var callback = instance.callback; instance.callback = null; return callback(err); } }); return instance; };