Promise对象入门
简介
promise对象可以获取异步操作的消息,提供统一的API,各个异步操作都可以用同样的方法进行处理。
promise对象不受外界影响,其有三种状态:pending(进行中)、fulfilled(成功)、rejected(失败),只有异步操作的结果可以决定当前状态,一旦状态改变就不可以再变化,状态改变方向有两种:pending -> fulfilled、pending -> rejected
promise对象的意义就在于将异步操作以同步操作的流程表达,避免层层嵌套的回调函数
基本用法
let promise = new Promise(function (resolve, reject) {
if () {
resolve(value) // 异步操作成功
} else {
reject(error) // 失败抛错
}
})
Promise构造函数接受一个函数作为参数,该函数有两个参数:resolve、reject,当执行resolve函数时Promise对象状态pending -> fulfilled,当执行reject时Promise对象状态pending -> rejected
promise.then(function (value) {
}, function (error) {
})
Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数,第二个参数为可选参数,例子:
let promise = new Promise(function (resolve, reject) {
console.log('promise')
resolve('11')
})
promise.then(function (value) {
console.log(value)
})
console.log('22')
执行结果'promise -> 22 -> 11',promise对象新建后立即执行,then方法的回调会在所有同步任务执行完成后执行
catch
promise.prototype.catch()是then()方法的别名,用于指定发生错误时的回调函数
new Promise(function () {
}).then(() => {
}).catch(err => {
console.log(err)
})
如果异步操作抛出错误,状态就会变为reject,就会调用catch中的回调,当状态为resolve,执行then方法中的回调时,若报错同样回进入catch的回调
意义:当我们使用promise异步操作时,但是没有使用catch捕获错误时,若promise异步执行报错时,外部代码并不会接收到错误,而是继续执行不受影响
const someAsyncThing = function() {
return new Promise(function(resolve, reject) {
resolve(x);
});
};
someAsyncThing().then(function() {
console.log('ok');
});
setTimeout(() => { console.log('continue') }, 100);
如代码所示,x变量并没有定义,期待的操作是执行报错,然后停止运行,实际上continue会执行输出,这说明当没有catch捕获错误时,外部代码不会知道Promise对象内部执行已经报错,因此会继续执行。
finally
不管Promise对象最后结果如何,都会执行的操作,finally方法中的回调函数不接受任何参数
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
all
Promise.all方法用于将多个Promise实例包装成一个新的实例
Promise.all([p1,p2,p3]).then((array) => {
}).catch((err) => {
})
只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
Promise对象入门的更多相关文章
- ES6入门之Promise对象
1. Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理.更强大. 1.1 什么是Promise 简单来说就是一个容器,里面保存着某个未来才会结 ...
- JavaScript异步编程(1)- ECMAScript 6的Promise对象
JavaScript的Callback机制深入人心.而ECMAScript的世界同样充斥的各种异步操作(异步IO.setTimeout等).异步和Callback的搭载很容易就衍生"回调金字 ...
- ES6 之 let和const命令 Symbol Promise对象
ECMAScript 6入门 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了. (2016年6月,发布了小幅修订的<ECMASc ...
- 如何在外部终止一个pengding的promise对象
今天在整理前段时间做过的项目,发现之前在集成web环信的时候遇到过一个奇怪的需求:需要终止一个正在进行等待返回的promise,或者阻止其调用resolve和reject.(具体为何会有这种需求我也不 ...
- es6学习笔记--promise对象
Promise对象是为了简化异步编程.解决回调地狱情况 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可 ...
- 这次聊聊Promise对象
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 Promise是CommonJS提出的一种规范,在ES6中已经原生支持Promise对象,非ES6环境可以 ...
- Promise对象及它在js中的执行顺序
关于Promise对象的学习及它的执行顺序 学习阮一峰老师的ES6入门后的记录 1.promise的定义 promise是一个对象,通常包裹着一个异步操作,promise对象提供一些接口的方法,返回一 ...
- angular学习笔记(二十八-附2)-$http,$resource中的promise对象
下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...
- ES6深入学习记录(二)promise对象相关
1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理和强大.ES6将其写进了语言标准,统一了用法,原生提供了promise对象. 所谓Promis ...
随机推荐
- luogu P4798 [CEOI2015 Day1]卡尔文球锦标赛 dp 数位dp
LINK:卡尔文球锦标赛 可以先思考一下合法的序列长什么样子. 可以发现后面的选手可以使用前面出现的编号也可以直接自己新建一个队. 其实有在任意时刻i 序列的mex>max.即要其前缀子序列中1 ...
- P4491 [HAOI2018]染色 广义容斥 NTT 生成函数
LINK:染色 算是比较常规的广义容斥. 算恰好k个 可以直接转成至少k个. 至少k个非常的好求 直接生成函数. 设\(g_k\)表示至少有k个颜色是满足的 那么有 \(g_k=C(m,k)\frac ...
- Guava基本工具--常见Object方法
在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals,hashCode和toString等方法.每次写这几个方法都要做很多重复性的判断, 很多类库提供了覆写这 ...
- JDBC(3)-数据库事务
一.环境搭建(复习) 首先建立lib目录然后要把对应的jar包导进来 然后就是jdbc.properties文件 user=root password=123456 url=jdbc:mysql:// ...
- 用python悄悄记录了室友的抖音在线时间
今天给大家分享一篇有趣的文章,灵感来自于前几天与室友的聊天,他告诉我抖音可以实时显示人的在线情况,如下图: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在 ...
- react 样式冲突解决方案 styled-components
前置 在 react 中解决组件样式冲突的方案中,如果您喜欢将 css 与 js 分离,可能更习惯于 CSS-Modules:如果习惯了 Vue.js 那样的单文件组件,可能习惯于使用 styled- ...
- java_抽象类、接口、多态的使用
抽象类 抽象类:包含抽象方法的类. 抽象方法 : 没有方法体的方法. 使用 abstract关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体. 格式为:修饰符 abstra ...
- 【Python笔记】2020年7月22日练习=[定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程的两个解]
学习教程:廖雪峰-Python教程-函数-函数定义 学习记录:[定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程的两个解] 学习心得: 1.对问题进行判断分析后再下手. ...
- Java连接Redis,存储对象获取对象()byte和json),连接池
Java连接Redis Jedis连接Redis,Lettuce连接Redis Jedis连接Redis 1. 创建maven项目 2. 引入依赖 <dependencies> <d ...
- SCOI2020迷惑记
睡了个好觉还是很困但没咋吃饭就出门了. 到了之后随便跟认得到的人扯了两句就进去了. 结果让我们站在外面等... 然后通知说不能自带水和吃的那我这个中午没吃饭的咋整啊. 马上啃了半块巧克力就进了考场,然 ...