微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从外部变量接收$.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);
  1. 首先创建一个变量statusCode用于接收响应码,初始化为0;
  2. 后执行一个POST请求,在回调函数中将响应码赋给statusCode;
  3. 最后输出statusCode。

执行上面示例代码,即使服务器返回的响应码是1,控制台输出的也是初始值0;

拿不到返回值我认了,问题是:为什么不是undefined或者null呢?

因为输出statusCode前,根本没有执行statusCode = e。

 

个人理解

所谓异步就是,console.log(statusCode)和$.ajax()是互不相干的,是同时执行的,

也就是说console.log(statusCode)执行完了,$.ajax()还在跟服务器握手,回调函数还没来得及执行。

从逻辑上来说,当执行到console.log(statusCode)时,解释器会在上下文查找statusCode的定义,因为var statusCode = 0success: function (e) { statusCode = e; }更快,所以statusCode直接拿到了初始值。

 

既然var statusCode = 0success: 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] 举报,一经查实,本站将立刻删除。

相关推荐