首先js是单线程这是无容置疑的,因为js作为浏览器脚本语言,js的主要用途就是与用户互动,以及操作DOM渲染页面。这就决定了它只能是单线程,不然会带来很麻烦的同步问题。但是随着需求的增长,还是需要js进行多线程处理的。下面是关于promise方面需要了解的点
1.同步(synchronous)异步(asynchronous)
同步可以理解为在同一时间你只能做一个事情,这就可以说是在调用栈(后进先出)。
function one () {
console.log(1);
two();
console.log(3);
}
function two () {
console.log(2);
}
one() // 1 2 3
异步可以理解为边听歌边敲代码,这可以说是使用消息队列(task queue)。
(消息队列:在开启多线程的时候,浏览器还会维护一个消息列表,除了主线程,其余的都是副线程,这些副线程合起来就叫消息列表。)
const list = () => {
setTimeout(() => {
console.log('setTimeout内部回调啦!')
},1500)
};
console.log('one');
list();
console.log('two');
// 打印结果: one two setTimeout内部回调啦!
宏任务(macro-task):js同步执行的代码块,setTimeout、setInterval、XMLHttprequest、setImmediate、I/O、UI rendering等。
微任务(micro-task):promise、process.nextTick(node环境)、Object.observe, MutationObserver等。
微任务的等级比宏任务执行等级高一点
浏览器执行的顺序:
(1)执行主代码块,这个主代码块也是宏任务
(2)若遇到Promise,把then之后的内容放进微任务队列
(3)遇到setTimeout,把他放到宏任务里面
(4)一次宏任务执行完成,检查微任务队列有无任务
(5)有的话执行所有微任务
(6)执行完毕后,开始下一次宏任务。