谈谈promise,谈谈微任务
  • javascript 的异步执行机制,思路基本上是这样的,先执行同步任务,然后执行异步微任务,然后执行异步宏任务
  • 还说什么,宏任务是 setTimeOut这些,然后微任务是 promise这些
  • 其实,在早些时候,我就测试过setTimeOut和promise的异步执行优先级那个时候我就知道 promise的异步执行优先级 是要高于 setTimeOut的如果你告诉我因为 setTimeOut是异步宏任务promise是异步微任务,因为是先执行微任务然后执行异步宏任务,因此,promise的异步优先级要比 setTimeOut要高,我想说这和没说是一样的
如何创建一个微任务?
  • 我不知道有没有人想过这个问题,可能你会觉得直接使用 promise就可以创建一个微任务,但是,如果不使用 promise呢?
  • 事实上,这个问题就已经问到了 promise异步执行的本质了
  • 这个问题必须要搞懂,因为接下来我要使用 javascript原生实现一个真正的 promise
  • 为此我看了很多 promise原生实现的博客,希望能找到 实现微任务的蛛丝马迹,但是绝大多数的博客的 promise原生实现的异步实现方式(或者说 微任务),都是基于 setTimeOut,这很明显就已经脱离了 promise基于微任务的本质了
直接看 promise的源代码
  • 没办法,为了找到 微任务的实现方式,我只能去看 promise的源代码,因为 promise的异步机制就是基于微任务
  • 在这里有一个忠告,如果你想真正理解一个原理,直接看源代码是最好最直接的
  • 还真给我找到了,请看:(以下是 promise的源代码)
  • 这个函数引起了我的关注,因为在文件的他引入了一个插件
  • 这就是微任务的本质
  • 使用这个插件就可以创建一个微任务使用 npm i asap可以直接下载
  • 当然了,但这里我也就不继续深究了,因为 这已经可以让我实现一个原生的 promise了,但是如要继续深究的话,会涉及到 javascrip更底层的代码
现在来创建一个微任务
var asap = require("asap/raw")asap(function(){console.log("center...")
})
  • 这就是一个简单的微任务,可能你会觉得有点假,现在拿他来和 异步宏任务 setTimeOut比较一下 异步优先级
var asap = require("asap/raw")
setTimeout(()=>{console.log("header...")
},0)
asap(function(){console.log("center...")
})
console.log("footer...")
  • 如果这真的是微任务的话,那么,结果应该是 footer,center,header
  • 看到了吗,这就是微任务的创建方式,有了这个就可以实现原生实现一个 promise了
下一章我在原生实现一个 promise

谈谈promise,谈谈微任务相关推荐

  1. 为什么promise就是微队列?setTimeOut就是宏队列?

    为什么promise就是微队列?setTimeOut就是宏队列? 其实就是线程的事,宿主线程的回调就是宏队列,像setTimeout网络通信,JS是自己的,就是微队列. 或者可以这样说,因为proms ...

  2. 【es6】谈谈Promise

    学习vue写项目已经很久了,在项目中有许多地方会使用到Promise,无论前后端的接口通信,还是各种第三方的组件库或是插件,或多或少都会发现Promise的影子,所以今天简单梳理一下关于Promise ...

  3. 谈谈Promise的前世今生

    前言 谈到Promise,大家都熟烂于心,有的童鞋已经在项目中大规模使用async/await,甚至有的开始用上了fetch.无论什么方式,实质都是Promise的封装和语法糖,所以弄清楚了Promi ...

  4. 当我们谈微服务,我们在谈什么?谈谈我对微服务的理解!

    作者:fredal fredal.xin/talking-msa-understand-msa 阅读目录 微服务是什么 微服务是什么样的 服务化的前提 服务的发布与引用 服务的注册与发现 服务的远程通 ...

  5. 谈谈我对微服务的理解

    微服务是一个近些年说的非常热的概念,尤其在互联网的大背景下,微服务的理论有机会被广泛实践.但是在实践过程中,大家对微服务的理解确大相径庭,到底要怎样做才能真正掌握微服务的架构理论呢?通过此文笔者想和大 ...

  6. Promise(微任务)- 让你看完就懂

    1. 图示 思维导图链接 https://www.zhixi.com/view/23ff2291 2. 使用promise原因 在没有promise的时候,一直使用setTimeout函数,这样就会造 ...

  7. 谈谈几个SpringCloud常见面试题及答案

    作者:Wbw Belief blog.csdn.net/qq_41497111/article/details/92067565 全文目录 什么是微服务? 微服务之间如何独立通讯的? SpringCl ...

  8. promise微任务宏任务问题整理

    1. 问:for循环里面有1000次循环,前500次每次都是把data赋值为1,后500次每次都是把data赋值为2,问:dom一共渲染了几次? 答:DOM一次都没有渲染,因为for循环是一个js执行 ...

  9. js---对事件循环宏任务和微任务的理解

    一.JS特点 Js作为一门单线程语言,即一次只能完成一个任务,当有多个任务时,任务就得进行排队等待执行,只能等待自己的前一个任务执行完成后自己才能执行. 二.JS事件循环 要理解JS的事件循环的就必须 ...

最新文章

  1. Google I/O 2019上提及的Javascript新特性
  2. linux系统 安卓系统安装教程,最简单的Ubuntu Touch Android 双系统安装方式
  3. python中字符串运算符及用法_python将字符串转换为运算符
  4. 一步步使SSH连接您的github仓库
  5. 分析citibike数据eda
  6. 百亿身家中年男子告别房地产转行学Python,我们推荐他读这6本书
  7. iPhone SE 3共有三款:或将提供全面屏版本
  8. javascript Event监听
  9. MySQL-bin.index no found (errcode:13-perssion)
  10. mysql字段长度的作用_数据库字段的长度 作用
  11. 字体图标浅析——什么是字体图标?如何生成?怎么使用?
  12. JavaScript基础学习总结(一) 适合小白
  13. kali安装网易云1.1和打不开问题解决
  14. html让字数超过多少,css强制省略号 css设置超过多少个字显示省略号
  15. 什么是胖客户端和瘦客户端?什么是哑终端?(转)
  16. 016 Rust死灵书之安全方式内存初始化
  17. 如何在2022年建立自己的NFT市场平台
  18. 源码角度分析Rebuild和Rebatch
  19. 阿里云PHP SDK(升级版)使用说明:
  20. CVPR2022|比VinVL快一万倍!人大提出交互协同的双流视觉语言预训练模型COTS,又快又好!

热门文章

  1. 【git】You have not concluded your merge (MERGE_HEAD exists).
  2. 如何搭建一个自己的图床
  3. 云服务器oa系统,oa系统放到云服务器云服务器
  4. 2015ccpc——G - Ancient Go
  5. Windows 10 Mscomctl.ocx缺失解决方法
  6. 手持PDA连接无线网络后下载安装程序
  7. AD布线布局和抗干扰
  8. 科学解释:为什么越是无知的人越自信?
  9. python爬虫进阶-同城旅游酒店评价(JS逆向)
  10. 【VS】VS远程调试说明文档(局域网内)