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
相关产品推荐
相关产品推荐

