Promise对象及它在js中的执行顺序
关于Promise对象的学习及它的执行顺序
学习阮一峰老师的ES6入门后的记录
1、promise的定义
promise是一个对象,通常包裹着一个异步操作,promise对象提供一些接口的方法,返回一些操作的状态或错误信息
promise有三种状态 pending(进行中)、resolved(已完成,也叫fulfilled)、rejected(已失败)
注意:promise中的状态只能由 pending -> resolved 和 pending -> rejected两种,且状态一旦确认不能转变
promise的基本用法
<script>
let promise = new Promise(function(resolve,reject){//resolve和reject是函数
console.log('promise创建');
resolve();
})
promise.then(function(){//相当于resolve()
// console.log(a);//error跳到.catch
console.log('promise的执行完成了');
})
.catch(function(){//相当于reject()
console.log('promise的执行失败了');
})
</script>
2、promise的一些方法
.then(fn1,fn2)
.then()方法中的参数,fn1是resolved状态的回调函数,fn2(可选)是rejected状态的回调函数,一般只用fn1来作为promise成功的处理函数
注意:.then()返回的是一个新的promise实例,.then(fn1)fn1中的返回的数据作为新promise的参数
.catch(fn)
.then(null/undefined,function(){})的别名,是发生错误是的回调函数
注意:在promise执行顺序中当.then()的成功处理函数执行,导致不会执行.catch()中的函数,反之一样
.finally(function(){})
不论是执行.then()还是执行.catch(),finally都会执行
代码示例:
<script>
let promise = new Promise(function(resolve,reject){
let i = 1;
resolve(i);//调用.then()中的方法
i++;
reject(i);//调用.catch()中的方法,不能与.then()一起执行
})
promise
.then(function(num){
console.log(num);
})
.catch(function(num){
console.log(num);
})
.finally(function(){//不论执行.then还是.catch,finally都会执行
console.log('finally');
})
</script>
3、promise中的执行顺序
js执行是单线程的,所以浏览器执行会把js事件,划分为当前执行,和等待执行的栈
等待执行中的栈一般为异步事件,其中也分为宏任务和微任务之分,一般是执行一个宏任务后,执行微任务栈里的所有微任务,在接着执行下一个宏任务,在执行任务途中会将对应的宏任务和微任务依次添加到对应的栈中(也就是说在下一个宏任务执行之前,微任务的等待栈是空的)
promise对象.then,.catch为微任务
代码示例:
<script>
setTimeout(function(){
console.log('setTimeout执行了');//宏任务
})
let promise = new Promise(function(resolve,reject){
console.log('promise执行了');//主进程
resolve();//or reject();
})
promise
.then(function(){
console.log('.then执行了');//微任务
})
.catch(function(){
console.log('.catch执行了');//微任务
})
.finally(function(){
console.log('finally执行了');//微任务
})
</script>
上面代码的执行顺序是:

Promise对象及它在js中的执行顺序的更多相关文章
- JS中函数执行顺序的问题?
作者:知乎用户链接:https://www.zhihu.com/question/23564807/answer/82996422来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- js中的执行环境及作用域
最近在面试时被问到了对作用域链的理解,感觉当时回答的不是很好,今天就来说说js中的作用域链吧. 首先来说说js中的执行环境,所谓执行环境(有时也称环境)它是JavaScript中最为重要的一个概念.执 ...
- 进阶学习js中的执行上下文
在js中的执行上下文,菜鸟入门基础 这篇文章中我们简单的讲解了js中的上下文,今天我们就更进一步的讲解js中的执行上下文. 1.当遇到变量名和函数名相同的问题. var a = 10; functio ...
- php课程 1-3 web项目中php、html、js代码的执行顺序是怎样的(详解)
php课程 1-3 web项目中php.html.js代码的执行顺序是怎样的(详解) 一.总结 一句话总结:b/s结构 总是先执行服务器端的先.js是客户端脚本 ,是最后执行的.所以肯定是php先执行 ...
- Java 基础:继承中的执行顺序
1.单独的父类测试 Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分, 它们的执行顺序相对来说比较简单,用程序也很容易验证. 比如新建一个 ...
- JavaScript在页面中的执行顺序(理解声明式函数与赋值式函数) 转载
JavaScript在页面中的执行顺序 https://blog.csdn.net/superhoy/article/details/52946277 2016年10月27日 15:38:52 阅读数 ...
- Unity脚本在层级面板中的执行顺序测试3
断断续续的写了3篇,以后有时间可以做成一个系列了 前面2篇测试了GameObject的顺序,以及Awake和OnEnable的时机: Unity脚本在层级面板中的执行顺序测试1 http://www. ...
- Unity脚本在层级面板中的执行顺序测试4-附加整理
测试4为一些附加内容,后续的各种tips都加在此. 前几篇测试的链接: Unity脚本在层级面板中的执行顺序测试1 http://www.cnblogs.com/hont/p/4298110.html ...
- 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)
[分析]浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang) 今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间 ...
随机推荐
- 详解计算机中的Byte、bit、字、字长、字节
最近突然有同事问我,关于计算机中的计量单位大B和小b的区别,以及KB到GB之间的换算问题,我当时觉得这问题简单,大B是 byte,小b是bit,但是想到他俩之间的换算时,一时有些想不起来具体是1Byt ...
- Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker
今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...
- 1.InfluxDB-官方测试数据导入
本文翻译自官网,官方文档地址:https://docs.influxdata.com/influxdb/v1.7/query_language/data_download/ 1.下载官网示例数据 命令 ...
- macOS10.14.2 gem 更新问题
macOS10.14.2,最近cocoapods不能正常使用了. 终端输入 sudo gem update –system 显示如下错误 ERROR: While executing gem … (G ...
- 常见Failed to load ApplicationContext异常解决方案!!
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- Java学习笔记之方法
前言:如果把所有代码都写到main方法中,后果是什么? 1,结构混乱 不清晰 2,不能重用 方法:规则:方法写在类中,不能写在其它方法中.方法不能嵌套方法 如何定义方法: 访问修饰符 返 ...
- window下 phpstorm 打不开
如果 window 上不能执行 strace 命令, 安装 Git Bash 工具. 切换到 phpstorm 安装的 bin 目录: D 盘的相关文件昨天被我删了!奇怪这文件怎么放到那里了? 换个路 ...
- 数据结构1_C---单链表的逆转
通过C语言函数实现单链表的逆转操作 例: 输入数据1,2,3,4 输出数据4,3,2,1 一共三个文件: 头文件stulist,h :链表结点的定义,结点指针的定义 源文件stulist.c:具体的实 ...
- java读取存在src目录下和存在同级目录下的配置文件
如果我有个文件存在src下一级的地方和存在src同级的目录应该怎么用相对路径去获取如图: 一.如果存在src同级的地方应该是InputStream in = new BufferedInputStre ...
- ElasticSearch业务逻辑案例
ElasticSearch业务逻辑案例 一.业务难题 我们有一个索引: myindex/mytype(为了方便,我们下文以a/b表示) 索引类型中的一个字段group之前是a.b.c(历史遗留问题), ...