Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 事件侦听器回调上的Node.js生成器函数_Javascript_Node.js_Generator - Fatal编程技术网

Javascript 事件侦听器回调上的Node.js生成器函数

Javascript 事件侦听器回调上的Node.js生成器函数,javascript,node.js,generator,Javascript,Node.js,Generator,我正在尝试节点的生成器函数,但在与事件侦听器回调一起使用时遇到了问题。请检查我使用的代码 function* fileLineByLine(file){ var fs = require('fs'), readline = require('readline'); var rd = readline.createInterface({ input: fs.createReadStream(file), output: process.stdout, termin

我正在尝试节点的生成器函数,但在与事件侦听器回调一起使用时遇到了问题。请检查我使用的代码

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())

有人有主意吗?

你不能每行都返回。节点读线是异步的。您可以使用thunk获取值,但仍然必须向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);
}));

经过一夜的思考,要点如下:

它过去是驱动它的

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);
});
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;
};
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);
});
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;
};

所以rd.on'line'没有返回值,是吗?还是它会回报一个承诺?你有什么问题?你到底想做什么,记录第一行?是的,你期望这里会发生什么?您没有将回调传递给rd.on'line'。我还不太熟悉生成器函数,但这对我来说似乎不太合适。我想返回每一行。基本上是