promise用法十道题
JS是单线程语言,多数的网站不需要大量计算,程序耗时主要是在磁盘I/O和网络I/O上 ,虽然固态硬盘SSD读取很快,但是和CPU比起来却不在一个数量级上,而且网络上的一个数据包来回时间更慢,所以一些CPU直接执行的任务就是主线程任务优先执行,随之就有了同步任务(主线程排队执行的任务前一个执行完毕才执行下一个)和异步任务(不进入主线程,而进入任务队·task queue·,等主线程执行完才开始执行)之分。任务队列又分为microtask(①process.pbservw②promise③Object.observer④MutationObserve)和macrotask(setTimeout、setInterval和setImmediate、i/o和UI渲染)
每个事件循环event loop会有一个以上task queue==macrotask queue 值得注意的是每个包裹在script标签中的代码也是一个macrotask。
事件循环的顺序决定了js代码执行的顺序,它从整体代码开始第一次循环,之后全局上下文进入函数调用栈,直到调用栈清空,只剩下全局,然后执行所有的micro task.当所有的micro task执行完毕循环再次从macro task开始找到其中一个任务队列执行完毕,然后执行再执行micro task,这样一直循环下去
ex1:
const promise =new promise((resolve,reject)=>console,log(1);resolve();console.log(2));
promise.then(()=>{
console.log(3);
});
console.log(4);
结果是1 2 4 3(因为promise.then中的函数是异步执行的)
ex2:
const promise1 =new promise((resolve,reject)=>{
setTimeout(
()=>{resolve('success')}
,100)
})
const promise2 = promise1.then(
()=>{throw new Error('erro')}
)
console.log('promise1',promise1)
console.log('promise2',promise2)
setTimeout(()=>{
console.log('promise1',promise1)
console.log('promise2',promise2)
},2000)
结果是 :promise1 Promise{<pending>}
promise2 Promise{<pending>}
(node:50928) ....
因为promise有三种状态,状态一旦改变就凝固不可逆 上面的promise2并不是promise1 而是返回一个新的Promise实例
ex3:const promise = new Promise(()=>{
resolve('success'),
reject('error')
})
Promise.then((res)=>{
console.log('then':res)
}).catch((err)=>{
console.log('catch',err)
})
结果:then:success1
构造函数中的resolve或reject 只有第一次执行有效,多次调用是没有效果的,因为其状态一旦改变就凝固
另外链式操作可以用return this 实现 promise 每次调用.then 或.catch都会返回一个新的promise从而实现了链式操作。
Promise的.then和.catch的参数期望值是函数,传入的非函数则会发生值穿透
事件循环起始于all scripts 是属于task(macro task)然后在主线程run 期间将ticks promise压入miscro task ,setTimeout压入macro task剩下的cobnsole.log直接执行,然后开始执行一遍micro task 这是考虑ticks优先级大于promise 所以输出s ticks在前,当micro task执行完了又去执行一个macro task 然后又清Micro task一遍再去执行macro task 如此循环
promise用法十道题的更多相关文章
- 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)
嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...
- c/c++ 多线程 等待一次性事件 std::promise用法
多线程 等待一次性事件 std::promise用法 背景:不是很明白,不知道为了解决什么业务场景,感觉std::async可以优雅的搞定一切的一次等待性事件,为什么还有个std::promise. ...
- ES6语法 promise用法
ES6语法 promise用法 function doSomething(){ return new Promise((resolve,reject)=>{ resolve('jjjj');// ...
- es6的promise用法详解
es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...
- [WinJS] Promise 用法
初学 WinJS, 可能对 Promise 的用法不大清楚,本文简要说明一下 WinJS中 promise 的基本用法. 主要参考自:http://try.buildwinjs.com/#promis ...
- Es6 Promise 用法详解
Promise是什么?? 打印出来看看 console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...
- ES6 Promise 用法讲解
Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...
- Promise 用法
Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 Promise的构造函数接收一个参数,是 ...
- ES6 Promise用法讲解
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. ES6 规定,Promise对象是一个构造函数,用来生成Promise实例. 下面代码创造了一个 ...
随机推荐
- MAVEN简介之——settings.xml
概述 Maven的settings.xml配置了Maven执行的方式,像pom.xml一样,但是它是一个通用的配置, 不能绑定到任何特殊的项目.它通常包括本地仓库地址,远程仓库服务,认证信息等. se ...
- Ajax配合vue+element打造个人专属loading
最近有使用到element组件中的loading,主要是处理后台传输数据太大,页面这边较长时间处于一个白屏,这里使用了一个loading组件,来进行一个优化,当然这只是视觉层面的一个简单优化,如果不用 ...
- SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解
构建分布式系统非常复杂且容易出错.Spring Cloud为最常见的分布式系统模式提供了简单易用的编程模型,帮助开发人员构建弹性,可靠和协调的应用程序.Spring Cloud构建于Spring Bo ...
- Sketchup (待续)
Sketchup插件 来自20个最好用的SketchUp插件 https://www.bilibili.com/video/av17242031/?from=search&seid=15336 ...
- appium工作原理
Appium原理 面试的时候,被问到appium原理,一点不会,实在尴尬.大家可以直接翻看原作https://blog.csdn.net/jffhy2017/article/details/69220 ...
- Windows Server 2012安装IIS 8.0
一.安装 1.鼠标右键[This PC]→[Manage] 2.选择[Add Roles and Features] 3.勾选[.Net Framewore 3.5] 和 [.Net Framewor ...
- css img 隐藏的边距
因为图片存在浏览器默认的边距,正常的情况下,增加这样的属性来消除多余的边距或者多1px的情况 img { display: block; border: node; } 但是这样的话img在父元素里设 ...
- Gatling实战(二)
在上一篇实战讲解了Gatling的用例,不过还没涉及到性能方面的内容,其实用例中的最后一句就和性能有关了 setUp(scn.inject(atOnceUsers(1)).protocols(http ...
- Openssl 升级操作
转自:http://www.cnblogs.com/lzcys8868/p/9235538.html 首先我觉得没事就用绿盟扫漏洞的公司,就是闲的蛋疼,傻逼!不少服务器使用nginx,如果openss ...
- PHP选择排序
选择排序,非常的直观,也相对简单. 思路如下: 假设,从小到大排序. 首先,第一轮循环,从所有数组中,找出最小的元素,然后将其下标记录下来. 然后,确定不是第一个元素,则和第一个元素进行交换. 接下来 ...