node.js 带有 if / else 语句的 readline - 如果输入为空则卡住

node.js readline with if / else statements - gets stuck if empty input

我想在终端中输出问题并接收答案作为输入。对于每个问题,都有一个检查,在这种情况下,是否提供了输入。如果是,则输出下一个问题;如果不是,问题应该循环。

如果每次都提供输入,resolve() 会被调用并转到下一个问题,这是应该的。但是,如果第一次发送空输入,就会出现问题。它有点卡住了,resolve() 不再工作了

const rdline = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let userName, userSurname = "";

第一个问题

const question_name = () => {
    return new Promise((resolve) => {
        rdline.question("What's your name?\n", name => {
            if (name) {
                userName = name;
                resolve();
            } else {
                question_name();

            }
        });
    });

};

第二题

const question_surname = () => {
    return new Promise((resolve) => {
        rdline.question("What's your surname?\n", surname => {
            if (surname) {
                userSurname = surname;
                resolve();
            } else {
                question_surname();
            }
        });
    });
};

两个问题都叫

const askUser = async () => {
    await question_name();
    await question_surname();
    console.log(`Hi, ${userName} ${userSurname}`);
    rdline.close();
};

askUser();

js中有一个函数叫做resolve。我建议你这样做 function questionname() {...} 而不是调用箭头函数。 另外,使用另一个名称而不是解析。

您似乎没有解析数据,并期望 userNameuserSurname 存在于 askUser

而是解决答案和重复问题,并将它们分配到 askUser:

// mock rdline
const rdline = {
  question: (a,b) => a.match(/surname/) ? b('Test') : b('User'),
  close: () => {}
};

const question_name = () => {
    return new Promise((resolve) => {
        rdline.question("What's your name?\n", name => {
            if (name) {
                resolve(name);
            } else {
                resolve(question_name());
            }
        });
    });

};

const question_surname = () => {
    return new Promise((resolve) => {
        rdline.question("What's your surname?\n", surname => {
            if (surname) {
                resolve(surname);
            } else {
                resolve(question_surname());
            }
        });
    });
};

const askUser = async () => {
    const userSurname = await question_name();
    const userName = await question_surname();
    console.log(`Hi, ${userName} ${userSurname}`);
    rdline.close();
};

askUser();