Node.js新手求助:如何同步等待ValidateToken回调执行完成
解决Node.js异步函数等待问题:让ValidateToken执行完毕再继续
原代码的核心问题是ValidateToken是异步函数,它的回调函数会在后续事件循环中执行,而非立刻运行。你写的if(!existingTokenValidated)会在ValidateToken的回调修改状态前就完成判断,此时existingTokenValidated还是初始的false,导致不管token是否有效,都会直接调用GetLoginToken,这就是重复调用的原因。
下面给出两种可行的解决方案:
方案1:回调嵌套(基础写法)
把判断是否需要调用GetLoginToken的逻辑,放到ValidateToken的回调函数里,确保等异步操作完成后再执行后续逻辑:
// 直接用布尔值,无需new Boolean let existingTokenValidated = false; const sessionToken = $.cookie("sessionToken"); if (sessionToken !== undefined) { ValidateToken(sessionToken, function(result) { // 等ValidateToken返回结果后再更新状态 existingTokenValidated = result === 'true'; // 统一处理后续逻辑 checkAndGetLoginToken(existingTokenValidated); }); } else { // 没有sessionToken,直接进入后续逻辑 checkAndGetLoginToken(false); } function checkAndGetLoginToken(isValid) { if (!isValid) { GetLoginToken(function(result) { if (result === 'true' && $.cookie("sessionToken") !== undefined) { callback('true'); } else { callback('false'); } }); } else { callback('true'); } }
方案2:Promise + async/await(现代写法)
这种方式让异步代码看起来更像同步代码,可读性更强,也是Node.js现在推荐的异步处理方式:
首先把现有的异步函数封装成Promise:
// 封装ValidateToken为Promise function validateToken(token) { return new Promise((resolve) => { ValidateToken(token, (result) => { resolve(result === 'true'); }); }); } // 封装GetLoginToken为Promise function getLoginToken() { return new Promise((resolve) => { GetLoginToken((result) => { resolve({ success: result === 'true', hasSessionToken: $.cookie("sessionToken") !== undefined }); }); }); }
然后用async/await等待异步操作完成:
async function handleAuthentication() { let isTokenValid = false; const sessionToken = $.cookie("sessionToken"); if (sessionToken !== undefined) { // 等待ValidateToken执行完毕,拿到结果 isTokenValid = await validateToken(sessionToken); } if (!isTokenValid) { // 等待GetLoginToken执行完毕 const loginResult = await getLoginToken(); if (loginResult.success && loginResult.hasSessionToken) { callback('true'); } else { callback('false'); } } else { callback('true'); } } // 调用异步函数 handleAuthentication();
关键说明
- Node.js是异步非阻塞的,不要强行用同步思维写代码,要适应异步流程。
- 回调嵌套是基础写法,Promise+async/await是更易维护的现代写法,建议你逐步掌握。
内容的提问来源于stack exchange,提问作者NIRMAL BISHT
相关产品推荐
相关产品推荐

