ajax 中 success 方法的 return

做前后台交互时会经常用到 ajax,有时候会遇到这样的情况,我们在 a 方法中调用 b 方法,b 方法里是一个 ajax,成功请求后会返回一个结果 data,而我们希望通过 b 方法的返回值获取到 data,我们的代码可能是这样的:

javascript 复制代码
function a() {
	var data = b();
}

function b() {
	$.ajax({
        type : "GET",
        url : "",
        dataType : "json",
        success : function (data) {
        	return data;
        }
    });
}
复制代码

但是,这样直接在 ajax 中的 success 方法里写 return data 是不能达到预期效果的,其实,上面的过程相当于如下的代码:

javascript 复制代码
function a() {
	var data = b();
}

function b() {
	ajax();
}

function ajax() {
	success();  //成功时调用success方法
}

function success() {
	return data;
}
复制代码

调用 ajax 时,可以看做调用了一个叫 ajax 的方法,当成功的时候,ajax 会再调用一个叫 success 的方法,可以看到,此时 data 只是被 return 到 ajax 方法中,而 ajax 并没有继续向外 return,所以,通过 ajax 中 success 方法获取到的返回结果,只是存在于 ajax 内部,b 方法并不知情。

因此,如果希望 b 能返回 data,只需把 data 赋值给 b 中的一个变量,再在 ajax 之后返回这个变量即可:

复制代码
javascript 复制代码
function a() {
	var data = b();
}

function b() {
	var result;
	$.ajax({
        type : "GET",
        url : "",
        dataType : "json",
		async : false,
        success : function (data) {
        	result = data;
        }
    });
	return result;
}

不过需要注意的是,ajax 中需要把 async 属性设置为 false,async 的意思是异步,设置为 false,就代表这个 ajax 不再是异步的,而是同步的。同步异步有什么区别呢?在这个问题中,如果是异步的,则可能 ajax 还没有执行到 success 方法,后面的 return result 就已经执行了,也就获取不到 data 了。而如果设置为同步,那么 ajax 后面的代码就会等待 ajax 执行完毕才执行,这样 return result 就是已经赋过值的了。

相关推荐
漆黑骑士4 分钟前
Web Component
前端
San306 分钟前
深入理解 JavaScript 事件机制:从事件流到事件委托
前端·javascript·ecmascript 6
行走在顶尖9 分钟前
基础随记
前端
Sakura_洁17 分钟前
解决 el-table 在 fixed 状态下获取 dom 不准确的问题
前端
best66618 分钟前
Vue3什么时候不会触发onMounted生命周期钩子?
前端·vue.js
best66619 分钟前
Javascript有哪些遍历数组的方法?哪些不支持中断?那些不支持异步遍历?
前端·javascript·面试
特级业务专家23 分钟前
Chrome DevTools 高级调试技巧:从入门到真香
前端·javascript·浏览器
爱学习的程序媛27 分钟前
【Web前端】Angular核心知识点梳理
前端·javascript·typescript·angular.js
小时前端29 分钟前
前端架构师视角:如何设计一个“站稳多端”的跨端体系?
前端·javascript·面试
p***h64330 分钟前
JavaScript图像处理开发
开发语言·javascript·图像处理