我理解Node.js中异步事件的基本原理,我正在学习如何以这种方式编写代码。但是,我遇到了以下情况:
我想写的代码偶尔暂停用户输入。
该程序不打算用作服务器(尽管目前它是用于命令行的)。我意识到这是Node的非典型用法。我的目标是最终将程序迁移回客户端JavaScript应用程序,但我发现在Node.js中工作既有趣又非常有用。这让我回到我的例子来说明这个问题:
它读入一个文本文件并输出每一行,除非该行以“?”。在这种情况下,它应该暂停,以便用户澄清该行的含义。目前,我的程序首先输出所有行,然后等待最后的澄清。
有没有什么方法可以强制node.js在条件触发的情况下(即,行以“结束的情况下)暂停命令行输入?“)?
var fs = require("fs");
var filename = "";
var i = 0;
var lines = [];
// modeled on http://st-on-it.blogspot.com/2011/05/how-to-read-user-input-with-nodejs.html
var query = function(text, callback) {
process.stdin.resume();
process.stdout.write("Please clarify what was meant by: " + text);
process.stdin.once("data", function(data) {
callback(data.toString().trim());
});
};
if (process.argv.length > 2) {
filename = process.argv[2];
fs.readFile(filename, "ascii", function(err, data) {
if (err) {
console.error("" + err);
process.exit(1);
}
lines = data.split("\n");
for (i = 0; i < lines.length; i++) {
if (/\?$/.test(lines[i])) { // ask user for clarification
query(lines[i], function(response) {
console.log(response);
process.stdin.pause();
});
}
else {
console.log(lines[i]);
}
}
});
}
else {
console.error("File name must be supplied on command line.");
process.exit(1);
}
字符串
5条答案
按热度按时间0sgqnhkj1#
下面是另一种没有依赖关系的方法(readline是内置的)
字符串
sc4hvdpw2#
诀窍是不要迭代地做,而是递归地做for循环。所以下一行是回调函数中的printOut,它被称为A:在该行被打印之后,或者B:在已经处理了控制台输入之后。
字符串
这是一个很好的解决方案,原因有二:
1.它相对干净,整个过程可以包含在自己的函数闭包中,可能导致模块化。
1.它不会中断您可能想要执行的其他异步操作。
没有迭代等待循环,每个数组中只有一个异步任务被启动。如果在你的版本中,你有数百万行呢?你会瞬间启动数百万个异步输出...糟糕!
递归方法不仅允许更好地并发您想要做的其他异步工作,而且您不会用一个函数调用的小型异步任务阻塞事件循环。这可能会导致内存问题、性能下降和其他值得避免的问题,特别是在大输入时。
vpfxa7rd3#
我发现了一个模块,它可以很容易地完成是或否:
https://www.npmjs.com/package/cli-interact
安装:
npm install cli-interact --save-dev
如何使用直接取自npm网站:
字符串
e4yzc0pl4#
下面是与mpen相同的答案,但没有令人困惑/不必要的promise Package 器:
字符串
qq24tv8q5#
在文档中我发现了这个,没有使用promise Package 器。
字符串