如何提取Ajax success回调返回值到函数外部全局使用
问题本质
你写的代码拿不到值核心是两个原因:
- Ajax默认是异步非阻塞的:发起请求后浏览器不会等服务端返回结果,会直接执行后面的DOM赋值、日志打印代码,这时候success回调还没触发,
getLastTime变量根本没定义,直接报引用错误。 success回调里的return没有任何效果:这个返回值只会被jQuery内部消费,你在外层代码里完全接不到这个返回值,不可能靠这种方式把值传到回调外面。
不要硬把异步拿到的值往同步执行流里塞,所有依赖请求结果的逻辑,都必须保证在请求响应完成之后再执行,下面是三种常用的实现方案:
方案1:直接在回调内处理后续逻辑(最简单推荐)
没有特殊需求的话直接把所有用到请求结果的逻辑写到success回调里就行,没有多余的封装,不会出现时序错误:
$.ajax({ url: ajaxurl, data: { action: "showDbValues", }, success: function(response) { const getLastTime = response.data.task_time; const getLastTitle = response.data.task_title; // 所有依赖返回结果的逻辑直接写在这里 document.querySelector(".c-add-task-show-time").innerHTML = getLastTime; console.log(getLastTime); }, error: function(errorThrown) { window.alert(errorThrown); }, });
方案2:用async/await 封装请求(适合复杂逻辑复用)
jQuery的$.ajax本身返回符合Promise规范的对象,可以用async/await写成同步的写法,把请求结果从请求逻辑中解耦出来,方便多处复用:
// 封装通用请求函数 async function getDbValues() { try { const res = await $.ajax({ url: ajaxurl, data: { action: "showDbValues" } }); return { lastTime: res.data.task_time, lastTitle: res.data.task_title } } catch (err) { window.alert(err); return null; } } // 业务逻辑处调用 async function initTaskModule() { // 等待请求完成拿到结果后,就可以在当前作用域随意使用 const taskData = await getDbValues(); if (!taskData) return; document.querySelector(".c-add-task-show-time").innerHTML = taskData.lastTime; console.log(taskData.lastTime); } initTaskModule();
方案3:全局变量存储(非必要不推荐)
如果确实需要把结果存在全局作用域供其他逻辑调用,一定要严格控制执行时机,必须等请求完成、全局变量赋值完成后,再执行读取变量的逻辑:
// 提前在全局作用域声明变量 window.lastTime = null; window.lastTitle = null; $.ajax({ url: ajaxurl, data: { action: "showDbValues" }, success: function(response) { // 给全局变量赋值 window.lastTime = response.data.task_time; window.lastTitle = response.data.task_title; // 赋值完成后再触发所有依赖全局变量的逻辑 renderTaskInfo(); bindTaskEvent(); }, error: function(errorThrown) { window.alert(errorThrown); }, }); // 依赖全局数据的逻辑封装成函数,等请求完成后再调用 function renderTaskInfo() { document.querySelector(".c-add-task-show-time").innerHTML = window.lastTime; console.log(window.lastTime); }
❌ 绝对不要为了拿值给Ajax加
async: false改成同步请求,这种写法会阻塞浏览器主线程,请求过程中页面会完全卡死无法交互,属于已经被废弃的非标准用法,体验极差。
内容的提问来源于stack exchange,提问作者NoName84
相关产品推荐
相关产品推荐

