You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js异步confirm函数问题:代码提前执行返回undefined

问题分析与解决方案

问题根源

你的confirm函数虽然加了async关键字,但内部并没有返回一个能等待用户输入完成的Promise。prompt.get是基于回调的异步操作,函数执行到prompt.get后就直接结束了,所以这个async函数会立刻返回一个状态为resolved的Promise,值是undefined——这就是为什么await会直接拿到undefined,后续代码先执行,而输入提示还在等待用户输入。

修复方案

把基于回调的prompt.get包装成Promise,让async函数能正确等待异步操作完成后再返回结果:

修改后的yesno模块代码:

const prompt = require('prompt');

const yesnoOptions = {
    properties: {
        confirm: {
            pattern: /^yes|no|ja|nee$/i,
            message: 'Antwoord met ja of nee.',
            required: true
        }
    }
};

async function confirm(){
    prompt.start();
    // 把prompt.get包装成Promise
    return new Promise((resolve, reject) => {
        prompt.get(yesnoOptions, function(err, result){
            if (err){
                reject(err); // 错误时抛出异常
                return;
            }
            // 根据输入返回对应值
            const isConfirmed = String(result.confirm).match(/^yes|ja$/i);
            resolve(isConfirmed ? 1 : 0);
        });
    });
}

module.exports = {
    confirm: confirm,
}

修复原理

  • 现在confirm函数返回的是一个Promise,这个Promise会在用户完成输入、回调执行后才会resolve或reject
  • 使用await yesno.confirm()时,代码会等待Promise状态改变后再继续执行后续的console.log
  • 用.then()链式调用时,回调也会在用户输入完成后才执行

测试调用代码示例:

const yesno = require('./yesno');

async function test() {
    let reply = await yesno.confirm();
    console.log(`reply ${reply}`); // 现在会在用户输入后才打印正确值
}

test();

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:05:24