$.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);
执行上面示例代码,即使服务器返回的响应码是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应该仅对当前请求有效,毕竟每次请求都可以定义该参数。
结论:同时执行却不叫“同步”,起名那个人脑子有坑。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。