标签:异步 执行 console log ajax 接收 statusCode
$.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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。