一、为什么JavaScript是单线程?(核心特征)
javascript是单线程模式,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。
原因:与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。
决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
为了利用多核CPU的计算能力,HTML5提出了Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程的控制,且不得操作DOM。所以这个新标准并没有改变JavaScript的单线程的本质。
二、任务队列
单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。
promise
是什么?
- 主要用于异步计算
- 可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
- 可以在对象之间传递和操作promise,帮助我们处理队列
总结:
- Promise 是一个类。
- 通过 new 实例化一个 Promise 类时,需要传递一个执行器(回调函数)进去,执行器会立即执行。
- 执行器有两个参数,参数类型皆是函数。
- Promise 有三个状态:pending、fulfilled、rejected,pending->fulfilled/pending->rejected,一旦状态确定就不可更改。
- 执行器参数函数调用时改变状态,resolve 和 reject 用来更改状态。
- 实现 then 方法,接受两个参数,参数类型为函数,Promise 状态更改为 fulfilled 时调用第一个参数,状态更改为 rejected 时调用第二个参数。
- resolve 接收一个值,在 then 方法第一个回调函数执行时作为默认参数传入。reject 方法接收一个异常对象,在 then 方法第二个回调函数执行时作为默认参数传入。
为什么会有promise?
为了避免界面冻结(任务)
- 同步:假设你去了一家饭店,找个位置,叫来服务员,这个时候服务员对你说,对不起我是“同步”服务员,我要服务完这张桌子才能招呼你。那桌客人明明已经吃上了,你只是想要个菜单,这么小的动作,服务员却要你等到别人的一个大动作完成之后,才能再来招呼你,这个便是同步的问题:也就是“顺序交付的工作1234,必须按照1234的顺序完成”。
- 异步:异步:则是将耗时很长的A交付的工作交给系统之后,就去继续做B交付的工作,。等到系统完成了前面的工作之后,再通过回调或者事件,继续做A剩下的工作。AB工作的完成顺序,和交付他们的时间顺序无关,所以叫“异步”