JavaScript异步场景下如何更新全局token并在其他函数复用?
解决异步登录后全局Token复用问题
嘿,我明白你遇到的问题了——这是典型的异步代码执行顺序坑!particle.login是一个异步操作,它不会卡住等登录完成再往下走,所以当你后面的console.log('tokenoutprint2:', token);执行时,登录请求还在后台跑呢,token自然还是初始的"12345"。
要确保拿到更新后的token再调用callFunctionAVC,我们得让代码“等一等”登录完成。这里给你两种实用的解决方案,都是基于Promise异步机制来处理的:
方案一:基于Promise链式调用改造(贴合你原有代码风格)
var token = "12345"; function einloggen() { // 让函数返回登录请求的Promise对象 return particle.login({username: userName, password: passWord}) .then(function (data) { token = data.body.access_token; console.log('tokenoutprint1:', token); return token; // 返回更新后的token,供后续调用使用 }) .catch(function (err) { console.log('LoggingIn Failed', err); throw err; // 抛出错误,避免后续代码错误执行 }); } // 调用登录函数,等登录成功后再执行后续逻辑 einloggen() .then(function(updatedToken) { console.log('tokenoutprint2:', updatedToken); // 这里肯定是新的token值 callFunctionAVC(updatedToken); // 放心复用token调用目标函数 }) .catch(function(err) { console.log('流程执行失败:', err); });
方案二:用async/await简化异步逻辑(更易读的写法)
如果你觉得链式调用有点绕,async/await是更直观的选择,它是Promise的语法糖:
var token = "12345"; async function einloggen() { try { // 用await等待登录请求完成,拿到返回数据 const data = await particle.login({username: userName, password: passWord}); token = data.body.access_token; console.log('tokenoutprint1:', token); return token; } catch (err) { console.log('LoggingIn Failed', err); throw err; } } // 封装整个执行流程的异步函数 async function executeLoginAndCallFunction() { try { const updatedToken = await einloggen(); console.log('tokenoutprint2:', updatedToken); callFunctionAVC(updatedToken); } catch (err) { console.log('流程执行失败:', err); } } // 启动流程 executeLoginAndCallFunction();
额外提醒
- 要确保
userName和passWord这两个变量在调用einloggen之前已经被正确赋值,不然登录会直接失败哦。 - 如果
callFunctionAVC本身也是异步操作,你同样可以用.then或者await来处理它的返回结果。
内容的提问来源于stack exchange,提问作者F3IIX8
相关产品推荐
相关产品推荐

