我理解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);
}
Run Code Online (Sandbox Code Playgroud)
mpe*_*pen 31
这是另一种没有依赖关系的方法(readline是内置的)
const readline = require('readline');
function askQuestion(query) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
return new Promise(resolve => rl.question(query, ans => {
rl.close();
resolve(ans);
}))
}
const ans = await askQuestion("Are you sure you want to deploy to PRODUCTION? ");
Run Code Online (Sandbox Code Playgroud)
Chr*_*sCM 13
诀窍是不要尝试它,但递归地执行for循环.因此,下一行是回调中的printOut,在行打印后调用A:或者在处理控制台输入后调用B:
var fs = require("fs");
// modeled on http://st-on-it.blogspot.com/2011/05/how-to-read-user-input-with-nodejs.html
function query(text, callback) {
'use strict';
process.stdin.resume();
process.stdout.write("Please clarify what was meant by: " + text);
process.stdin.once("data", function (data) {
callback(data.toString().trim());
});
}
function printLinesWaitForQuestions(lines, someCallbackFunction) {
'use strict';
function continueProcessing() {
if (lines.length) {
printNextLine(lines.pop());
} else {
someCallbackFunction();
}
}
function printNextLine(line) {
if (/\?$/.test(line)) { // ask user for clarification
query(line, function (response) {
console.log(response);
process.stdin.pause();
continueProcessing();
});
} else {
console.log(line);
continueProcessing();
}
}
continueProcessing();
}
if (process.argv.length > 2) {
var filename = process.argv[2];
fs.readFile(filename, "ascii", function (err, data) {
'use strict';
if (err) {
console.error("" + err);
process.exit(1);
}
var lines = data.split("\n");
printLinesWaitForQuestions(lines, function () {
console.log('Were done now');
});
});
} else {
console.error("File name must be supplied on command line.");
process.exit(1);
}
Run Code Online (Sandbox Code Playgroud)
这是一个很好的解决方案,原因有两个:
我找到了一个模块,可以很容易地做到这一点是肯定或否定:
https://www.npmjs.com/package/cli-interact
安装: npm install cli-interact --save-dev
如何使用直接从npm网站:
var query = require('cli-interact').getYesNo;
var answer = query('Is it true');
console.log('you answered:', answer);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30591 次 |
| 最近记录: |