NodeJS自定义模块async函数返回Promise pending但console.log正常问题
问题原因
所有async关键字声明的函数默认返回Promise对象,你当前以同步方式调用getG('Tim')时,接口请求还未执行完成,直接读取返回值自然只能拿到Promise { <pending> }的结果。必须通过await或者.then()的方式才能拿到异步返回的最终值。
解决方法
- 方法1:使用
.then()链式调用获取结果// 不需要额外封装getG也可以直接调用 genderApi.getGender('Tim').then(greeting => { // 所有需要用到性别称呼的后续业务逻辑都写在这里,比如拼接回复文本 const replyText = `${greeting},感谢您的咨询` // 此处执行发送回复的操作 console.log(replyText) }).catch(err => { // 建议加错误捕获,避免请求失败导致程序崩溃 console.error('获取性别失败', err) }) - 方法2:在异步上下文内使用
await获取结果
如果你习惯用await写法,需要把调用逻辑放在async函数内部,最常见的是用立即执行的async函数包裹:async function main() { // 所有后续需要用到性别称呼的逻辑都要放在这个async函数里 const greeting = await genderApi.getGender('Tim') const replyText = `${greeting},感谢您的咨询` // 执行后续回复逻辑 console.log(replyText) } main() // 新版Node.js支持顶层await,也可以直接在作用域最外层写: // const greeting = await genderApi.getGender('Tim')
现有代码优化建议
- 你写的
getG函数没有额外处理逻辑,属于冗余封装,直接调用genderApi.getGender即可 - 现有模块的Promise没有添加错误处理,建议补充请求异常的处理逻辑,避免意外挂起,同时对姓名参数做转义避免请求错误:
exports.getGender = function (name) { return new Promise((resolve, reject) => { https.get(`https://api.genderize.io?name=${encodeURIComponent(name)}`, (resp) => { // 原有逻辑保持不变 var data = ''; resp.on('data', (chunk) => { data += chunk; }); resp.on('end', () => { var info = JSON.parse(data); if (info.probability >= 0.8) { if (info.gender == 'male') { resolve('Sehr geehrter Herr'); } else if (info.gender == 'female') { resolve('Sehr geehrte Frau'); } } else { resolve('Sehr geehrte/r Frau / Herr'); } }); }).on('error', err => { // 捕获请求错误,可根据需求选择reject抛出错误,或者直接返回默认称呼 // reject(err) resolve('Sehr geehrte/r Frau / Herr') }) }); };
内容的提问来源于stack exchange,提问作者silliton
相关产品推荐
相关产品推荐

