美文网首页
单线程的js如何异步执行

单线程的js如何异步执行

作者: 肥羊猪 | 来源:发表于2021-02-26 10:08 被阅读0次

JavaScript是脚本语言,它需要在一个宿主环境里才能运行,接触较多的宿主环境就是--浏览器

浏览器多线程.png

JavaScript引擎线程称为主线程,它负责解析JavaScript代码;其他可以称为辅助线程,这些辅助线程便是JavaScript实现异步的关键

异步任务却又分为两种:一种叫“宏任务”(MacroTask 或者 Task),一种叫“微任务”(MicroTask)


异步任务.png
console.log(1);
setTimeout(() => {
    console.log(2);
}, 0);
Promise.resolve().then(() => {
    console.log(3);
});
console.log(4);
//1 - 4 - 3 - 2
因为 setTimeout属于宏任务,而Promise属于微任务

浏览器的Event Loop

1.执行全局Script同步代码,形成一个执行栈;
2.在执行代码时当遇到如上异步任务时便会按上文所描述的将宏任务回调加入宏任务队列,微任务回调加入微任务队列;
3.然而,回调函数放入任务队列后也不是立即执行;会等待执行栈中的同步任务全部执行完清空了栈后引擎才能会去任务队列检查是否有任务,
如果有那便会将这些任务加入执行栈,然后执行!
4.执行栈清空后,会先去检查微任务队列是否有任务,逐一将其任务加入执行栈中执行,期间如果又产生了微任务那继续将其加入到列队末尾,
并在本周期内执行完,直到微任务队列的任务全部 清空,执行栈也清空后,再去检查宏任务队列是否有任务,取到队列队头的任务放入到执行栈中执行,
其他可能又会产生微任务,那当本次执行栈中的任务结果清空后又会去检查微任务队列...
5.引擎会循环执行如上步骤,这就是Event Loop
浏览器的Event Loop.png
console.log('start');
setTimeout(() => {
    console.log('time1');
    Pormise.resolve().then(() => {
        console.log('promise1');
    })
}, 0);
setTimeout(() => {
    console.log('time2');
    Pormise.resolve().then(() => {
        console.log('promise2');
    })
}, 0);
Pormise.resolve().then(() => {
    console.log('promise3');
});
console.log('end');
//start - end - promise3 - timer1 - promise1 - timer2 - promise2

相关文章

  • Promise入门详解和基本用法

    异步调用 异步 JavaScript的执行环境是单线程。 所谓单线程,是指JS引擎中负责解释和执行JavaScri...

  • 题目

    js: setTimeout时间延迟为何不准?单线程,先执行同步主线程,再执行异步任务队列。 如何判断变量的类型?...

  • 运行机制,宏任务 与 微任务

    运行机制: JS 的本质是单线程执行 事件队列:同步任务,异步任务() 运行机制 1,JS 的本质是单线程执行 单...

  • web前端面试题@十七(js的单线程和多线程)

    js单线程重点: JS 是单线程的,但是却能执行异步任务, 这主要是因为 JS 中存在事件循环(Event L...

  • 事件循环机制

    Javascript是单线程执行的,出现异步时,并不会阻塞JS的执行,而是接着往下执行,等到异步结果返回时再处理。...

  • Node.js 通过进程、线程优化的性能

    1. node.js 单线程的特点 node.js 以异步非阻塞单线程,作为其执行速度的保障。什么是非阻塞单线程?...

  • js运行机制

    js是单线程运行。自上而下,然而为了解决代码阻塞的问题,js需要异步处理。先执行同步代码,等有空了,再执行异步 代...

  • JS事件循环EventLoop初探

    概念 js是基于单线程运行的,而一些特定事件又是异步执行的,所以这种单线程+异步的执行方式一定是事件驱动的 而一...

  • js 异步全览

    问题! JS 为什么是单线程的? 为什么需要异步? 单线程又是如何实现异步的呢? promise 的优点是什么? ...

  • 3.1KOA Promise 语法

    Promise 语法 同步与异步 我们知道,JavaScript的执行环境是「单线程」。所谓单线程,是指JS引擎中...

网友评论

      本文标题:单线程的js如何异步执行

      本文链接:https://www.haomeiwen.com/subject/vuwufltx.html