JavaScript函数调用间全局变量无法保留修改值问题求助
问题原因
这不是全局变量无法保留修改值的问题,核心是$.post是异步网络请求,代码执行顺序和你预想的不一样:
- 执行
get_server_model()时,$.post只会把请求发送给后端,不会阻塞等待后端返回结果,JS会直接继续执行$.post之后的代码,也就是你$(document).ready里后续的$("#demohi").text(...)逻辑,这时候$.post的回调函数还没有被触发,Client_Model还保留初始的空对象值,所以打印为空。 - 只有当后端接口返回响应后,
$.post的回调函数才会执行,此时才会给Client_Model赋值,所以回调内的打印可以拿到正确结果。
解决方案
方案1:把依赖Client_Model的逻辑移入回调
所有需要用到接口返回的Client_Model的代码,都放到$.post的回调函数中执行即可,修改后的示例代码:
var Client_Model = {}; // 页面加载完成后执行 $(document).ready(function() { get_server_model(); }); function get_server_model(){ $.post( "/get_server_model", { "cmd": "GET_SERVER_MODEL" }, function(resp){ var response = JSON.parse(resp); if (response.error === true) { alert("Error"); } else { Client_Model = response.server_model; set_page_elements(response.server_model); $("#demolow").text(JSON.stringify(Client_Model.graph_lines)); // 原来在ready里的后续逻辑移到这里 $("#demohi").text(JSON.stringify(Client_Model)); get_page_elements(); send_graph_data(); } }); }
方案2:用Promise+async/await优化异步流程
如果不想把所有逻辑都堆在回调里,可以封装异步请求,用同步写法执行异步逻辑:
var Client_Model = {}; // 页面加载完成后执行 $(document).ready(async function() { await get_server_model(); // 等请求执行完成后再执行后续逻辑 $("#demohi").text(JSON.stringify(Client_Model)); get_page_elements(); send_graph_data(); }); function get_server_model(){ // 返回Promise对象 return new Promise((resolve, reject) => { $.post( "/get_server_model", { "cmd": "GET_SERVER_MODEL" }, function(resp){ var response = JSON.parse(resp); if (response.error === true) { alert("Error"); reject() } else { Client_Model = response.server_model; set_page_elements(response.server_model); $("#demolow").text(JSON.stringify(Client_Model.graph_lines)); resolve() } }); }) }
内容的提问来源于stack exchange,提问作者johnnyX
相关产品推荐
相关产品推荐

