async函数链式调用then无返回值无法获取最后调用结果问题咨询
问题排查与修复方案
核心问题点
- 异步调用链没有正确返回:
desprate函数内部的getLangID调用没有加return,导致整个异步流程的结果没有被传递到函数外层,所以打印desprate()只能拿到无有效值的Promise,拿不到最终的容器数据 - 异步结果没有等待就直接打印:直接对async函数返回的Promise执行console.log,不会输出最终执行结果,需要等待Promise状态变更后再读取结果
- 异常未捕获:如果数据库查询过程中出现报错,没有catch捕获异常的话,错误会被静默吞掉,也会导致没有预期输出
- 额外小问题:
getLocalvars中直接把传入的container赋值给newcontainer,属于对象引用赋值,会直接修改原container对象,如果不需要修改原对象可以先做浅拷贝
修复后的代码
优先用await写法避免回调嵌套,可读性更高:
var container = { Login: '', sign_up_text: '', forget_password: '', login_button: '' } var lang = 'de-DE' var langID = 1 async function getVars (key, lang){ return db.localization.findOne({ where: { key: key, lang: lang } }) } async function getLangID (lang){ return db.localGroups.findOne({ where: { i10s: lang }, attributes: ['id'] }) } async function getLocalvars (container, lang){ // 如果不需要修改原container可以替换为:var newcontainer = {...container} var newcontainer = container for (let key in container) { console.log(lang) const data = await getVars(key, lang) newcontainer[data.key] = data.value; } return newcontainer; } async function desprate() { const langdata = await getLangID(lang) const data = await getLocalvars(container, langdata.id) console.log('内部打印结果:', data); return data; } // 等待异步执行完成后再打印结果,同时添加异常捕获 desprate().then(res => { console.log('最终返回结果:', res) }).catch(err => { console.error('执行出错:', err) })
如果你更习惯用.then链式写法,只需要给desprate里的每一层异步调用都加上return即可:
async function desprate() { return getLangID(lang) .then(langdata => { return getLocalvars(container, langdata.id) .then(data => { console.log(data); return data; }) }) }
内容的提问来源于stack exchange,提问作者Limuz
相关产品推荐
相关产品推荐

