首页 > 解决方案 > 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 魔法可以解决这个问题,如果有人对此有任何有趣的想法,我会很高兴听到它。undefinedconsole.log()

标签: javascriptnode.js

解决方案


推荐阅读