事件环
题目1
- 什么是宏任务?
- 什么是微任务?
- 同步任务?
- 异步任务?
- 事件轮询是什么?
my answer:
宏任务:定时器
微任务:resolve/reject的回调函数then()
同步任务:直接从调用栈中先入后出执行的程序
异步任务:如定时器是异步任务,存在阻塞问题
事件轮询:不太明确答案
解答:
- 宏任务:本身并不明确,如果当前宏是明确,当前宏就是执行栈中的执行的任务(所有或单一),其他说法实际上指的是异步任务,
- 微任务:promise/then,属于异步任务,针对宏任务来说
- 同步任务:
- 异步任务:ajax/then
- 事件轮询:事件回调通过异步任务出现不断循环,JavaScript先执行先同步,看事件回调的任务,可能是微任务,存在优先队列的问题,后异步,反复执行
补充:队列的实现?
题目2
//1.Promise.resolve(2).then(3) //并不是函数.then(Promise.resolve(4)) //这里是一个对象本身.then(console.log) //console.log 是一个函数//答案:2 所以直接返回函数的结果//为什么?只有是函数才会注册到成功/失败队列中,当条件完成以后,执行函数
//2.let p1 = new Promise(function(resolve, reject) {reject(42);});p1.catch(function(value) {console.log(value); //42return value + 1;}).then(function(value) {console.log(value); //43});//答案: 42 43
//3.let p1 = new Promise(function(resolve, reject) {resolve(42);});let p2 = new Promise(function(resolve, reject) {reject(43); //这里报错,没有捕获到});var p3 = p1.then(function(value) {console.log(value); //42return p2;}).then(function(value) {console.log(value); //42});//答案:42 undefined(因为这里p.then里没有return ) 报错//为什么?42: 是 p1 成功的回调报错:在reject的时候直接报错(没有注册失败的回调),
//3.改写let p1 = new Promise(function(resolve, reject) {resolve(42);});var p3 = p1.then(function(value) {console.log(value); //42return new Promise(function(resolve, reject) {reject(43); //这里报错,没有捕获到});}).then(function(value) {console.log(value); //42})//应该有catch.catch(function(err){console.log(err);})
//4.同步任务执行//挂起setTimeout(() => {console.log("1");Promise.resolve().then(() => {console.log("2");});});Promise.resolve().then(() => {console.log("3");//挂起setTimeout(() => {console.log("4");});});//答案:3 1 2 4先执行微任务(promise/then)再执行宏任务(定时器)
//5.Promise.resolve().then(() => {return Promise.resolve() // 在这加return 和不加return 的区别;.then(() => {console.log(1);}).then(() => {console.log(2);});}).then(val => {console.log(3);}).then(() => {console.log(4);}).then(() => {console.log(5);});//答案:return 12345没有return 13245
//6.async function async1() {await async2();console.log("1");}async function async2() {console.log("2");}async1();console.log(10);答案:2 10 12Promise{pending}101
//7.async function async1() {await async2();console.log("2");}async function async2() {Promise.resolve(1).then(() => {console.log(3);}).then(() => {console.log(4);}).then(() => {console.log(11);});}async1();setTimeout(function () {console.log(5);});new Promise(resolve => {console.log(6);resolve();}).then(() => {console.log(7);}).then(() => {console.log(8);}).then(() => {console.log(9);});console.log(10);
