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

异步函数调用getSessionId后transactionID始终为undefined的问题排查

问题分析与修复方案

你的核心问题出在getSessionId函数上,导致transactionID始终为undefined,下面是具体原因和修复步骤:

1. getSessionId函数的问题

这个异步函数存在两个关键错误:

  • 没有返回异步操作的结果:函数内部调用了ajaxPost但没有用return返回它的Promise,所以await getSessionId()拿到的是默认的undefined
  • Token拼接错误:参数里的token: API + " " + API.access_token和其他API调用格式不一致,应该是API.token_type + " " + API.access_token,否则可能导致接口调用失败,返回数据异常

2. 修复后的getSessionId函数

推荐用async/await替代then,让代码更简洁易读:

const getSessionId = async () => {
  const data = await ajaxPost("/utility/API/getSessionId", {
    token: `${API.token_type} ${API.access_token}`
  });
  return data.SessionID;
};

如果坚持用then,必须确保返回Promise链:

const getSessionId = async () => {
  return ajaxPost("/utility/API/getSessionId", {
    token: `${API.token_type} ${API.access_token}`
  }).then(data => data.SessionID);
};

3. 优化carAndiuv函数的写法

尽量避免await和then混合使用,减少嵌套层级,提升代码可读性:

const carAndiuv = async ArrayCarrelliPagamento => {
  let qtIuv = 0,
      totIuv = 0,
      percBar = $("prog-bar"),
      percentuale = 0,
      uniqueCodeOfCart = "",
      transactionID = "";

  // 获取购物车数据
  const data = await ajaxPost("/utility/API/recuperIuvCarrelli", {
    token: `${CEDtoken.token_type} ${CEDtoken.id_token}`,
    id_carrelli: JSON.stringify({ ...ArrayCarrelliPagamento }),
  });

  if (data.errCon == null) {
    qtIuv = Object.keys(data).length;
    // 仅获取一次transactionID
    transactionID = await getSessionId();
    console.log("TID est: " + transactionID);

    // 循环处理每个元素
    for (const sel in data) {
      console.log("TID int: " + transactionID);
      const iuv = await ajaxPost("/utility/API/inviaPagamentiPagopa", {
        token: `${API.token_type} ${API.access_token}`,
        codIuv: data[sel],
        UniqueCodeOfCart: uniqueCodeOfCart,
        TransactionID: transactionID,
      });
      
      uniqueCodeOfCart = iuv.UniqueCodeOfCart;
      totIuv++;
      percentuale = `${((100 * totIuv) / qtIuv) | 0}%`;
      // 更新进度条
      percBar.style.width = percentuale;
      percBar.textContent = percentuale;
      percBar.setAttribute("aria-valuenow", percentuale);
    }
  } else {
    console.log("Connection error");
    changeStatusOnline();
    tryReconnect();
  }
};

额外检查点

确保你的ajaxPost函数确实返回Promise,如果是基于jQuery的$.post,它本身实现了Promise接口,没问题;如果是自定义封装的函数,要保证内部用new Promise()包裹异步逻辑并正确resolve/reject。

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:15:36