You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:57:20