Javascript 如何解决NodeSchool';没有双工器包的s双工器挑战 问题(可从下载)

Javascript 如何解决NodeSchool';没有双工器包的s双工器挑战 问题(可从下载),javascript,node.js,stream,duplex,Javascript,Node.js,Stream,Duplex,编写一个程序,导出一个函数,该函数从 cmd字符串和args数组,并返回单个双工流 将派生进程的stdin和stdout连接在一起。有 这里有一个非常方便的模块:双工器。双工器模块 导出连接的单个函数双工器(可写、可读) 将可写流和可读流合并为一个, 可读/写双工流 官方解决方案 此代码基本上执行以下操作: var spawn = require("child_process").spawn, Stream = require("stream"); module.exports = f

编写一个程序,导出一个函数,该函数从
cmd
字符串和
args
数组,并返回单个双工流 将派生进程的stdin和stdout连接在一起。有 这里有一个非常方便的模块:双工器。双工器模块 导出连接的单个函数
双工器(可写、可读)
将可写流和可读流合并为一个, 可读/写双工流

官方解决方案 此代码基本上执行以下操作:

var spawn = require("child_process").spawn,
    Stream = require("stream");

module.exports = function (cmd, args) {
    var ps = spawn(cmd, args),
        stream = new Stream();
    stream.write = function (chunk, enc, cb) { ps.stdin.write(chunk, enc, cb); }
    stream.end = function (chunk, enc, cb) { ps.stdin.end(chunk, enc, cb); }
    ps.stdout.on("data", function (chunk) { stream.emit("data", chunk); });
    ps.stdout.on("end", function () { stream.emit("end"); });
    return stream;
}; 
不带双工器包的解决方案 我试图通过继承类来解决问题:

当我测试这个(
stream aventure verify program.js
)时,测试程序会打印
实际与预期的
表(它看起来是正确的),但之后它会被阻塞。我的代码怎么了?谢谢你的帮助

更新 添加此行可以解决以下问题:

Dx.prototype.end = function (chunk, enc, cb) { this.stdin.end(chunk, enc, cb); }
所以问题是,为什么仅仅实现
\u read
\u write
方法还不够?

在所有其他操作完成后仍然存在,这就是过程没有结束的原因。为了让进程结束,通常会使用方法
process.stdin.pause()
,因为您可以在此之后恢复进程

您可以尝试重写
.end()
方法,但这不是一种好的做法,更好的做法是:

#1如果知道要为此流写入的结束消息,则应在
.write()实现中添加
.resume()
方法:

dstream._write = function (chunk, encoding, callback) {

    this.stdin.write(chunk, encoding, callback);

    if (someConditionToEnd) {
        this.stdin.pause();
    }
};
#2收听结束事件:

/*
inside the stream prototype constructor
*/

this.on('end', function () {
    this.stdin.pause();
});
你说的“它被绊倒”是什么意思?这个过程还没有结束?还是发生了什么事?是的。测试程序在打印表格后“冻结”(我的意思是,它什么也不做)。更新:原来
end
方法丢失了。
dstream._write = function (chunk, encoding, callback) {

    this.stdin.write(chunk, encoding, callback);

    if (someConditionToEnd) {
        this.stdin.pause();
    }
};
/*
inside the stream prototype constructor
*/

this.on('end', function () {
    this.stdin.pause();
});