谈谈promise,谈谈微任务
谈谈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,谈谈微任务相关推荐
- 为什么promise就是微队列?setTimeOut就是宏队列?
为什么promise就是微队列?setTimeOut就是宏队列? 其实就是线程的事,宿主线程的回调就是宏队列,像setTimeout网络通信,JS是自己的,就是微队列. 或者可以这样说,因为proms ...
- 【es6】谈谈Promise
学习vue写项目已经很久了,在项目中有许多地方会使用到Promise,无论前后端的接口通信,还是各种第三方的组件库或是插件,或多或少都会发现Promise的影子,所以今天简单梳理一下关于Promise ...
- 谈谈Promise的前世今生
前言 谈到Promise,大家都熟烂于心,有的童鞋已经在项目中大规模使用async/await,甚至有的开始用上了fetch.无论什么方式,实质都是Promise的封装和语法糖,所以弄清楚了Promi ...
- 当我们谈微服务,我们在谈什么?谈谈我对微服务的理解!
作者:fredal fredal.xin/talking-msa-understand-msa 阅读目录 微服务是什么 微服务是什么样的 服务化的前提 服务的发布与引用 服务的注册与发现 服务的远程通 ...
- 谈谈我对微服务的理解
微服务是一个近些年说的非常热的概念,尤其在互联网的大背景下,微服务的理论有机会被广泛实践.但是在实践过程中,大家对微服务的理解确大相径庭,到底要怎样做才能真正掌握微服务的架构理论呢?通过此文笔者想和大 ...
- Promise(微任务)- 让你看完就懂
1. 图示 思维导图链接 https://www.zhixi.com/view/23ff2291 2. 使用promise原因 在没有promise的时候,一直使用setTimeout函数,这样就会造 ...
- 谈谈几个SpringCloud常见面试题及答案
作者:Wbw Belief blog.csdn.net/qq_41497111/article/details/92067565 全文目录 什么是微服务? 微服务之间如何独立通讯的? SpringCl ...
- promise微任务宏任务问题整理
1. 问:for循环里面有1000次循环,前500次每次都是把data赋值为1,后500次每次都是把data赋值为2,问:dom一共渲染了几次? 答:DOM一次都没有渲染,因为for循环是一个js执行 ...
- js---对事件循环宏任务和微任务的理解
一.JS特点 Js作为一门单线程语言,即一次只能完成一个任务,当有多个任务时,任务就得进行排队等待执行,只能等待自己的前一个任务执行完成后自己才能执行. 二.JS事件循环 要理解JS的事件循环的就必须 ...
最新文章
- Google I/O 2019上提及的Javascript新特性
- linux系统 安卓系统安装教程,最简单的Ubuntu Touch Android 双系统安装方式
- python中字符串运算符及用法_python将字符串转换为运算符
- 一步步使SSH连接您的github仓库
- 分析citibike数据eda
- 百亿身家中年男子告别房地产转行学Python,我们推荐他读这6本书
- iPhone SE 3共有三款:或将提供全面屏版本
- javascript Event监听
- MySQL-bin.index no found (errcode:13-perssion)
- mysql字段长度的作用_数据库字段的长度 作用
- 字体图标浅析——什么是字体图标?如何生成?怎么使用?
- JavaScript基础学习总结(一) 适合小白
- kali安装网易云1.1和打不开问题解决
- html让字数超过多少,css强制省略号 css设置超过多少个字显示省略号
- 什么是胖客户端和瘦客户端?什么是哑终端?(转)
- 016 Rust死灵书之安全方式内存初始化
- 如何在2022年建立自己的NFT市场平台
- 源码角度分析Rebuild和Rebatch
- 阿里云PHP SDK(升级版)使用说明:
- CVPR2022|比VinVL快一万倍!人大提出交互协同的双流视觉语言预训练模型COTS,又快又好!