从外部变量接收$.ajax()返回结果,理解什么叫“异步”
作者:互联网
$.ajax()默认是异步的,又或者说JavaScript本身就是异步的。那到底什么叫“异步”呢?
举个例子:
我的需求是,把一个数据发送给服务器,然后服务器返回一个响应码(0-失败|1-成功),我要拿到这个响应码,根据具体值在前端显示提示。
var statusCode = 0; $.ajax({ type: 'POST', url: '/updateurl', // async: false, data: {name:'Mon's Works'}, success: function (e) { statusCode = e; } }); console.log(statusCode);
- 首先创建一个变量statusCode用于接收响应码,初始化为0;
- 然后执行一个POST请求,在回调函数中将响应码赋给statusCode;
- 最后输出statusCode。
执行上面示例代码,即使服务器返回的响应码是1,控制台输出的也是初始值0;
拿不到返回值我认了,问题是:为什么不是undefined或者null呢?
因为输出statusCode前,根本没有执行statusCode = e。
个人理解
所谓异步就是,console.log(statusCode)和$.ajax()是互不相干的,是同时执行的,
也就是说console.log(statusCode)执行完了,$.ajax()还在跟服务器握手,回调函数还没来得及执行。
从逻辑上来说,当执行到console.log(statusCode)时,解释器会在上下文查找statusCode的定义,因为var statusCode = 0比success: function (e) { statusCode = e; }更快,所以statusCode直接拿到了初始值。
既然var statusCode = 0比success: function (e) { statusCode = e; }更快,那么把var statusCode = 0干掉,不就没有人比success: function (e) { statusCode = e; }更快了吗?
不好意思,结果是statusCode is not defined。
解决方案
如果把$.ajax()的async参数改成false,请求将以“同步”方式执行,解释器会等待请求完成并执行回调之后再console.log(statusCode),此时将输出1。
async: false应该仅对当前请求有效,毕竟每次请求都可以定义该参数。
结论:同时执行却不叫“同步”,起名那个人脑子有坑。
标签:异步,执行,console,log,ajax,接收,statusCode 来源: https://www.cnblogs.com/monsino/p/12884501.html