zoukankan      html  css  js  c++  java
  • 关于 微任务 和 宏任务的一些机制

    1.  promise 和 setTimeout设置时间为 0ms[或者不设置]  那个先运行?
     1 setTimeout(function(){
     2     console.log('定时器开始啦')
     3 });
     4 
     5 new Promise(function(resolve){
     6     console.log('马上执行for循环啦');
     7     for(var i = 0; i < 10000; i++){
     8         i == 99 && resolve();
     9     }
    10 }).then(function(){
    11     console.log('执行then函数啦')
    12 });
    13 
    14 console.log('代码执行结束');

    //output:
    //马上执行for循环啦
    //代码执行结束
    //执行then函数啦
    //定时器开始啦


    这玩意就涉及带js的运行机制了  由于js 是单线程的  做事情就需要排队  这样就会造成阻塞  这是 机智的人类就想到了异步; 我在某些地方看到 在js中像写回调函数可以写出来,但异步主要是通过一些想什么 addEventListener (听说这个好像是的) ,setTimeout,....之类来实现异步 [ 顺便插一句 异步函数一定在同步语句执行之后在执行 而且 异步函数里面一定有回调 但回调函数不一定是异步 ]  ;

    说到异步 就要说到 event loop 刚开始我以为这就是 for循环之类的玩意儿.

    event loop[事件循环]

    同步的东西都在主线程执行,而异步则是进入了一个 任务线程 那么此时就产生了一个疑问 这多开了一个任务队列 

    ① 所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。

    ② 主线程之外,还存在一个‘任务队列’(task queue)。只要异步任务有了运行结果,就在”任务队列”之中放置一个事件。

    ③ 一旦主线程的栈中的所有同步任务执行完毕,系统就会读取任务队列,选择需要首先执行的任务然后执行。

    这也算是 js 中异步的实现机制了吧; 然而问题 往往没那么简单  异步任务里面 又分为 微任务和宏任务 真的够了;

    宏任务):* script全部代码、setTimeoutsetIntervalsetImmediate....

    微任务):* Process.nextTick(Node独有)Promise.... 

    这里就有一个规定 微任务始终在宏任务之前执行  [她就是执行的 记住就完事了]

    2 js.堆 栈 队列 

    堆:     堆是指一块已分配的用来存储所需数据的存储空间

    栈 (先进后出);  可以看作一个按照顺序排列的消息数据集合。
     
    队列 : 可以看作是指一个按照顺序排列的消息事件集合。 (先进先出)
  • 相关阅读:
    Excel公式进阶教程
    Excel公式初级教程
    一阶常系数线性差分方程通解求法
    博客园为代码块添加复制功能
    MFC分割窗口(CSplitterWnd)与选项卡视图(CTabView)的混合使用
    自制软件改变窗口大小
    conda的基本使用
    安装GPU驱动
    更换conda源、安装pytorch
    服务器安装anaconda
  • 原文地址:https://www.cnblogs.com/diligent-noob/p/12787010.html
Copyright © 2011-2022 走看看