ajax请求消息队列,JavaScript中的事件循环与消息队列

2019-4-01更新:采纳JSC引擎的术语,我们把宿主(浏览器、Node环境)发起的任务称为宏任务(如SetTimeout),把JavaScript引擎发起的任务称为微观任务(如Promise)。

我们在接触到JavaScript语言的时候就经常听到别人介绍JavaScript 是单线程、异步、非阻塞、解释型脚本语言。

究竟应该如何理解这句话呢?

确切的说,对于开发者的开发过程来说,js确实只有一个线程(由JS引擎维护),这个线程用来负责解释和执行JavaScript代码,我们可以称其为主线程。例如在控制台输入如下代码:

console.log("a");

console.log("b");

console.log("c");

//依次输出a,b,c

可以看出,这段代码在主线程上是按照顺序执行的。但是我们平时的任务处理可能并不会直接获取到结果,这种情况下如果仍然使用同步方法,例如发起一个ajax请求,大概500ms后受到响应,在这个过程中,后面的任务就会被阻塞,浏览器页面就会阻塞所有用户交互,呈“卡死”状态。

console.log("a");

$.ajax({

url:"xxx",

async:false, //同步请求ajax

success:function(){

console.log("b");

}

})

console.log("c");

这种同步的方式对于用户操作非常不友好,所以大部分耗时的任务在JS中都会通过异步的方式实现。虽然js引擎只维护一个主线程用来解释执行JS代码,但实际上浏览器环境中还存在其他的线程,例如处理AJAX,DOM,定时器等,我们可以称他们为工作线程。同时浏览器中还维护了一个消息队列,主线程会将执行过程中遇到的异步请求发送给这个消息队列,等到主线程空闲时再来执行消息队列中的任务。

同步任务的缺点是阻塞,异步任务的缺点是会使代码执行顺序难以判断。

两者比较一下我们还是更倾向于后者。

到目前为止,我们已经涉及到了几个名词,主线程,js引擎,事件循环,消息队列等。接下来会对这些名词一一进行解释。

js引擎

我们所熟悉的引擎是chrome浏览器中和node.js中使用的V8引擎。它的大致组成如图:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值