异步函数调用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
相关产品推荐
相关产品推荐

