JS调用async日期转换函数返回Promise而非实际值如何解决?
问题原因分析
- 所有被
async关键字修饰的函数,默认返回值都是Promise对象,直接调用拿到的就是Promise实例,无法直接获取内部返回的实际值。 - 你添加await后依然拿到Promise,是因为
await关键字只能在被async修饰的函数内部使用,如果你调用formatdob的外层作用域没有被async修饰,await不会生效。
解决方法
方法1:外层添加async作用域 + await调用
如果是在Dialogflow的webhook处理逻辑中,直接把外层处理函数改为async修饰即可:
// 外层处理函数加async修饰 async function handleDialogflowFulfillment(df, globalParameter) { // 其他业务逻辑... const dob = await formatdob(df, globalParameter, dob); console.log("dob", dob); // 此处可直接拿到ISO格式的日期字符串 // 后续使用dob的逻辑都放在这个async函数内即可 }
如果是Node.js顶层作用域,可以用立即执行async函数包裹:
(async () => { const dob = await formatdob(df, globalParameter, dob); console.log("dob", dob); })()
方法2:用.then()链式调用获取值
不想修改外层作用域的话,可以直接用Promise的.then方法获取返回结果:
formatdob(df, globalParameter, dob) .then(dob => { console.log("dob", dob); // 此处拿到实际日期值,所有使用dob的后续逻辑都写在这个回调内 }) .catch(err => { console.error("日期转换出错:", err); })
现有代码优化建议
你当前的formatdob函数有两处可优化的问题,避免后续出现异常:
- 传入参数
dob和函数内部重新声明的let dob命名冲突,会覆盖传入的参数值,建议修改内部变量名 - 返回值处的
Date()调用没有加new关键字,部分运行环境下会报错,修正后的代码如下:
const formatdob = async (df,globalParameter) => { //birthDate should be in mm/dd/yyyy format try { console.log("globalParameter",globalParameter); let userInputDob = df._request.queryResult.queryText // 修改变量名避免冲突 globalParameter["dob"]=userInputDob; if(userInputDob.length!=0){ const d = new Date(userInputDob); return new Date( // 此处添加new关键字 Date.UTC( d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds() ) ).toISOString(); } return "" // 空输入时返回默认值,避免返回undefined } catch (err) { console.log(err) throw err; } }; module.exports = formatdob;
内容的提问来源于stack exchange,提问作者lakshmi
相关产品推荐
相关产品推荐

