gpt4 book ai didi

javascript - 使用 nodeJS async-await 反复提示用户直到解决

转载 作者:数据小太阳 更新时间:2023-10-29 05:24:46 28 4
gpt4 key购买 nike

我尝试反复向用户提问,直到他们使用此代码给出正确答案。

问题是,如果用户没有在第一时间给出正确答案,则无法解决。

var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

function promptAge() {
return new Promise(function(resolve){
rl.question('How old are you? ', function(answer) {
age = parseInt(answer);
if (age > 0) {
resolve(age);
} else {
promptAge();
}
});
});
}

(async function start() {
var userAge = await promptAge();
console.log('USER AGE: ' + userAge);
process.exit();
})();

以下是每个条件的终端输出:

当用户第一次给出正确答案时,没问题......

How old are you? 14
USER AGE: 14

当用户给出错误的答案时,它被卡住了(不会解决并且进程不会退出)...

How old are you? asd
How old are you? 12
_

当用户没有给出任何答案时,它也卡住了......

How old are you? 
How old are you?
How old are you? 12
_

谁能解释发生了什么,或者给我任何解释这种性质的文章/视频的引用?

顺便说一句,出于学习目的,我尝试使用 async/await 来执行此操作(尝试学习如何异步执行操作)。我已经在没有 async/await 的情况下尝试过这个(promptAge() 不返回任何 promise )并且没问题。

感谢您的关注。

最佳答案

这与 parseInt() 无关,尽管 skellertor 提供了良好的实践建议。

问题是每次调用 promptAge() 时您都会生成一个新的 Promise - 但原始调用者即 start() 只有第一个 Promise 的可见性。如果您输入了错误的输入,promptAge() 会生成一个新的 Promise(在一个从 Unresolved Promise 中)并且您的成功代码将永远不会运行。

要解决这个问题,只生成一个 Promise。有更优雅的方法可以做到这一点,但为了清楚起见,并避免将代码破解成无法识别的东西......

var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

// the only changes are in promptAge()
// an internal function executes the asking, without generating a new Promise
function promptAge() {
return new Promise(function(resolve, reject) {
var ask = function() {
rl.question('How old are you? ', function(answer) {
age = parseInt(answer);
if (age > 0) {
// internal ask() function still has access to resolve() from parent scope
resolve(age, reject);
} else {
// calling ask again won't create a new Promise - only one is ever created and only resolves on success
ask();
}
});
};
ask();
});
}

(async function start() {
var userAge = await promptAge();
console.log('USER AGE: ' + userAge);
process.exit();
})();

关于javascript - 使用 nodeJS async-await 反复提示用户直到解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45763072/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com