JavaScript异步

之前因为受到某宝的“鄙视”,于是我倍感难过,觉得我一定得写篇博客,把我理解的写出来。


我们知道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 状态时,无法得知目前任务进展到哪一个阶段。
 

之后的会在下一篇博客中更新



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值