浅识js——事件轮询

258 阅读2分钟

js基础知识——事件轮询

一、什么是事件轮询

  • 事件从开始执行代码开始执行轮询

二、事件轮询的规则

  1. 从 Js 整体代码开始(这是一个宏任务)
  2. 每执行完毕一个宏任务,就会清空一次微任务队列(不管微任务队列里有多少任务,都执行完毕)
  3. 再次执行下一个宏任务.
  4. 循环往复,直到有的任务队列清空结束

三、关键字

  1. 单线程: JS 是一个单线程的代码执行机制,逐行向下执行,上边的代码执行时向过长会阻塞下边的代码
  2. 调用栈:用来执行代码的,所有的代码进栈执行,执行完毕再出栈 (后进先出)
  3. 队列: 用来存放异步任务的,先进先出 宏任务队列: JS 整体代码,setTimeout,setInterval... 微任务队列: promise.then()...
  4. 轮询: 轮流询问宏任务与 微任务队列的任务来执行
  5. 注意: WEBApi,用来负责提供异步机制,计时,分配任务去指定队列

最关键每执行完毕一个宏任务,会清空一次微任务队列(前要分清什么是同步任务,什么是宏任务,什么是微任务)

    console.log(1);     // 同步代码 直接打印 1

    setTimeout(() => {
	    console.log(2);    //定时器 宏任务 等待     (第三轮 因为微任务执行完毕,所以执行宏任务  打印2)
    }, 0);

    new Promise((resolve) => {
	    console.log(3);			// 同步代码 直接打印 3
	    resolve();  
    }).then(() => {
	    console.log(4);   //promise.then() 微任务等待   (第二轮 执行微任务  所以直接打印4)
    });

    setTimeout(() => {    //定时器因为有500ms的计时,所以最后执行  是一个宏任务 等待执行(第三轮 代码段 进行拆分)
	    console.log(5);			//最后一轮 :同步代码 直接打印 5
	    new Promise((resolve) => {
		    console.log(6);       //最后一轮 同步代码 直接执行 打印 6
		    setTimeout(() => {     
			    console.log(7);      //最后一轮  宏任务(先执行微任务)最最最后执行这个 打印7
		    });
		    resolve();
	    }).then(() => {
		    console.log(8);      // 最后一轮 微任务 其他任务执行完毕 会先执行微任务,再执行宏任务,所以先打印 8
	    });
    }, 500);

    new Promise((resolve) => {   
	    console.log(9);			//同步代码 直接执行  9
	    resolve();
    }).then(() => {
	    console.log(10);		//promise.then() 微任务等待执行  (第二轮 执行微任务  所以直接打印10)

	    setTimeout(() => {     //定时器 宏任务 等待执行  (第三轮 因为44行计时器有500ms 所以 先打印这行   打印11)
		    console.log(11);
	    }, 0);
    });

    console.log(12);   //同步代码 直接打印 12

    // 第一轮执行打印: 1 3 9 12 
    // js整体代码是一个宏任务,所以执行完毕会执行微任务   所以第二轮打印 4  10  2 11
    // 执行500ms定时器的内容:5  6  8  7