javascript - node.js - 界面问题被跳过
问题描述
我对 javascript 和多线程之外的异步编程相当陌生。最近我遇到了 readline 的一个问题,因为我试图将它分解成一个函数,以便能够更像一个普通的输入函数使用它。测试程序由两个文件组成,一个主文件和我试图开始工作的模块。
主文件:
"use strict";
const readline = require("readline");
const terInput = require("./modules/terInput");
(async function main() {
let value;
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
value = await terInput(rl, "Write value: ");
rl.close();
}());
模块文件:
"use strict";
async function terInput(rl, question) {
let retValue;
rl.question(question, async function (value) {
retValue = value;
});
return retValue;
}
module.exports = terInput;
我想用这个小代码实现的是为我自己简化问题的使用。问题是,如果我尝试运行这个程序,我得到Write value:
的是一个答案并且没有任何输入,这不是很令人兴奋。我试图将返回值移动到不同的地方等等,但这对我的情况没有帮助。尝试将其放置rl.close()
在函数内部,因为我认为界面可能在函数之前关闭。然而,这也无济于事。我对 javascript 的思维方式非常陌生,来自 C++ 背景,这是一个相当棘手的问题。如果有人对这个问题有任何想法,我将非常感激。我试图找到其他有同样问题的人,但我还没有在那个搜索中找到任何地方。
提前致谢
编辑
经过进一步测试,我发现即使调用了 await,程序也不会等待函数。我通过再次rl.close()
输入问题功能对此进行了测试。这看起来像这样:
"use strict";
async function terInput(rl, question) {
let rValue;
rl.question(question, async function(value) {
rValue = value;
rl.close();
});
return rValue;
}
module.exports = terInput;
这段代码确实有点工作,在主文件中使用这个函数调用之后没有输出会给你输入。这意味着以这种风格编写代码:
(async function main() {
let value;
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
value = await terInput(rl, "Write value: ");
}());
将要求输入,但代码如下:
(async function main() {
let value;
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
value = await terInput(rl, "Write value: ");
console.log(value);
}());
不会工作,这让我很困惑。相反,它会给你Write value: undefined
从哪里来(暗示问题功能也没有将“\ n”打印到输出缓冲区中)。可能有一些 JavaScript 魔法可以解决这个问题,如果有人对此有任何有趣的想法,我会很高兴听到它。undefined
console.log()
解决方案
推荐阅读
- android - ionic firebase.getToken() 在 android API 23 6.0.0 上总是返回 null,但在其他版本的 android 中不返回
- vb.net - 为什么这些陈述会产生相反的结果?
- c# - C# ListBox,显示多列
- opengl - openGL - 使用不同的着色器渲染多个对象
- python - 无法在 Main() 中调用函数
- css - 尝试添加文本时 CSS 功能“内容”不起作用
- python-requests - 如何在请求(或 urllib3.response)中获取完整的服务器响应消息?
- spring - 文件编码中面临的问题 - 使用文件到字符串转换器的 UTF-8/16
- php - 将“全选”添加到过滤器
- java - SpringBoot:绕过 OncePerRequestFilter 过滤器