之前因为受到某宝的“鄙视”,于是我倍感难过,觉得我一定得写篇博客,把我理解的写出来。
我们知道javaScript是单线程异步执行,单线程意味着代码在任务队列(先进先出)中会按照顺序一个接一个的执行。
但是异步不是说完全按照代码的书写顺序去执行(不同于c)。
下面第一个我想说的是 setTimeout:
上面的这段代码,你觉得执行完test会出现什么呢?
你会再控制台看到它会输出 9个hello xiaoxiaosu ,之后再输出9个9
为什么会这样呢?
异步线程总是在JavaScript主线程空闲后(也就是for循环执行完毕)进行执行,所以我们会观察到hello xiaoxiaosu会
先于任何console.log(i)执行,而且对于变量i创建了闭包,所以最终的输出为9个9 。 对于此例,你可以这样认为,
for循环首先插入进程的队列,等for循环执行完,i的值已经变为9了,setTimeout在队列其后,
(ps: setTimeout被插入队列了9次,但是由于要等待主进程,所以i的值在之前还没打印出来),
终于轮到排在队列的setTimeout了,于是他就打印出来了9个i的值 i=9。
下面想说的是ajax请求
我们知道ajax的默认请求一般都是异步请求(但是如果想要同步请求的话,我们也可以通过async: false 去设置,让请求同步。)
$.ajax({ url: "test.html", method: "get", success: function(){ $(this).addClass("done"); }});
上面这个ajax请求就包含了一个success的成功回调函数。这些异步请求不会让页面的js的代码止步,所以建议异步,让浏览器不至于被卡死。
下面想说的是promise对象。
promise对象是CommonJs工作组提出的一种规范,为异步编程接口规范提供统一接口,。
它的思想是每一个异步任务返回一个promise对象,该方法有一个then的方法,允许指定回调函数
Promise 有一些缺点。第一 : 一旦新建它就会立即执行,无法中途取消。第二:如果没有设置回调函数,Promise 内部会抛出错误。
第三:当处于 Pending 状态时,无法得知目前任务进展到哪一个阶段。
之后的会在下一篇博客中更新