You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:55:07