JS异步Promise函数调用返回值为undefined问题排查
问题原因
你遇到的返回undefined问题来自两个核心写法错误:
- 自定义的
getSessionUser、getSessionTimer函数没有返回值:你在内部.then()回调里写的return只会把值传给Promise链的下一环,但是外层函数本身没有把executeJavaScript生成的Promise对象返回,调用函数时自然只能拿到JS函数默认返回的undefined。 - 异步逻辑没有等待执行完成:即便你给两个函数补上return,它们返回的也是异步Promise对象,你直接同步赋值、同步打印判断,代码不会等异步操作执行完就往下走,根本拿不到最终解析出来的用户、计时器数据。
修正方案
第一步:给两个工具函数补上return,把Promise对象返回给调用方,同时补全空值场景的默认返回,避免隐式返回undefined:
function getSessionUser() { return win.webContents.executeJavaScript('sessionStorage.getItem("user");', true) .then(result => { return result ? JSON.parse(result) : null; }); } function getSessionTimer() { return win.webContents.executeJavaScript('sessionStorage.getItem("timer");', true) .then(result => { return result ? JSON.parse(result) : null; }); }
第二步:改造generateActivity为异步函数,等待两个异步请求执行完成后再做后续逻辑,用Promise.all可以让两个查询并行执行,效率更高:
async function generateActivity() { // 并行等待两个session查询完成,拿到最终结果 const [user, timer] = await Promise.all([ getSessionUser(), getSessionTimer() ]); console.log(user); console.log(timer); if(user && timer) { activity.user = user; activity.timer = timer; const data = { activity: activity } try { await axios.post("http://creaz:81/xorix/api/desktop/save_activity", data, { headers: headers }) } catch (error) { console.log('活动保存失败', error); } activity.is_mouse = activity.is_keyboard = 0; } else { console.log('not logged in or no timer is running'); } }
如果你不想使用async/await语法,也可以通过
.then()嵌套的方式获取Promise结果,但是async/await的写法逻辑更直观,不容易出现回调嵌套问题。
内容的提问来源于stack exchange,提问作者Brian Millot
相关产品推荐
相关产品推荐

