如何不使用async:false,将PHP数组转为jQuery可访问的JS数组
解决同步Ajax弃用问题,实现PHP语言数组转JS访问
嘿,我明白你现在的困扰——同步Ajax被浏览器弃用了,得换个方式把PHP里的$lang数组拿到JS里用对吧?下面给你几种靠谱的方案,都能避开同步请求的坑:
方案1:用异步Ajax + 回调函数(适配现有代码结构)
原来的同步写法是强行等待请求完成再返回数据,现在改成异步,把需要用到翻译数据的逻辑放到回调里执行就行:
// 把原来的立即执行函数改成接受回调的函数 function cargarTraducciones(callback) { var action = "getTraducciones"; $.ajax({ type: "POST", dataType: 'json', // 直接指定json,不用自己手动parse了 url: '../egea/lib/egeaAjax/fAjaxUsuarios.php', data: { 'action': action }, success: function (datos) { // 拿到数据后执行回调,把翻译数据传进去 callback(datos); }, error: function() { // 可以加个错误处理,比如传入空对象用默认翻译 callback({}); } }); } // 调用的时候,把需要用翻译的逻辑写在回调里 cargarTraducciones(function(traducciones) { // 这里就可以正常使用traducciones了,比如 console.log(traducciones.bienvenido); // 页面初始化的翻译逻辑都可以放在这个回调里 });
对应的PHP函数不需要修改,不过把JS的dataType设为json后,jQuery会自动解析返回数据,省去手动JSON.parse的步骤。
方案2:直接在PHP页面输出全局JS变量(最高效,推荐)
如果你的JS代码是在PHP渲染的页面里(比如.php文件内的<script>标签),那完全不需要Ajax,直接把PHP数组转成JS对象输出就行,性能更好:
<?php // 先拿到$lang数组(和你原来的getTraducciones逻辑一致) session_start(); $u = $_SESSION['usuario']; if (isset($u)){ $lang = getLanguage($u); if(isset($lang)){ require "../../lang/".$lang.".php"; }else{ require "../../lang/es.php"; } } else { // 没有会话的话加载默认语言 require "../../lang/es.php"; } ?> <!-- 在页面中直接输出JS变量 --> <script> const traducciones = <?php echo json_encode($lang); ?>; // 现在直接就能使用翻译数据了 console.log(traducciones.bienvenido); </script>
这种方式不用发额外的HTTP请求,加载页面时直接把翻译数据注入到JS里,简单高效,适合大多数场景。
方案3:用Promise + async/await(现代JS写法)
如果你的项目支持ES6+,可以用Promise封装Ajax,再用async/await让代码逻辑看起来像同步写法,但本质还是异步的,不会阻塞主线程:
function cargarTraducciones() { var action = "getTraducciones"; return new Promise((resolve, reject) => { $.ajax({ type: "POST", dataType: 'json', url: '../egea/lib/egeaAjax/fAjaxUsuarios.php', data: { 'action': action }, success: resolve, error: reject }); }); } // 用async/await调用 async function init() { try { const traducciones = await cargarTraducciones(); // 这里可以正常使用翻译数据 console.log(traducciones.bienvenido); } catch (error) { console.error('加载翻译数据失败', error); } } // 初始化执行 init();
这种写法代码结构更清晰,符合现代JS的异步编程规范,也能完美避开同步Ajax的弃用警告。
内容的提问来源于stack exchange,提问作者Nando
相关产品推荐
相关产品推荐

