从外部变量接收$.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应该仅对当前请求有效,毕竟每次请求都可以定义该参数。

 

 

结论:同时执行却不叫“同步”,起名那个人脑子有坑。

posted @ 2020-05-13 19:56  Mon's_Works  阅读(328)  评论(0编辑  收藏  举报