promise的状态值_ES6中的Promise的用法总结
第一部分、什么是Promise ?
Promise是ES6中提供的一个异步编程的解决方案,Promise本身是一个构造函数
typeof Promise //function
一般情况下 我们在开发中会使用 new Promise() 调用构造函数,创建一个新的Promise对象, Promise对象有两个特点
1、对象的状态不受外界影响。Promise对象是一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。
只有异步操作的结果,可以决定Promise是哪一种状态,任何其他操作都无法改变这个状态
2、一旦Promise状态改变,就不会再有变化,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled 或者 从pending变为rejected。只要这两种情况发生,状态就不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的
使用Promise的好处,就是在处理异步程序时,将异步操作队列化,按照期望的顺序执行,返回符合预期的结果,这样即使是多重异步操作,也可以方便的使用Promise进行链式调用
3、Promise也有一些缺点。
首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
第二部分、循序渐进的介绍Promise的用法
1、最简单的用法
const p = new Promise((resolve, reject) =>{//在这里执行一个异步操作吧
setTimeout(function(){
console.log(1234)
resolve(1234)
},3000)
})//创建这个Promise之后, 3秒后 会控制台输出1234,并且3秒后得到了一个结果,异步程序返回了1234这个结果,那么
p.then((res)=>{
console.log(res)
})//控制台会输出1234 ,promise的then方法 会再次返回一个promise,不过值默认undefined
p.then((res)=>{
console.log(res)
}).then((res)=>{
console.log(res)
})//1234, undefined
2、reject的用法
const p2 = new Promise((resolve, reject)=>{//执行一个异步操作
setTimeout(function(){
console.log(1024)
reject(1024)
},3000)
})
p2.then(res=>{
console.log(res)
}).catch(res=>{
console.error(res)
})//3秒之后 输出错误 1024
3、all的用法, 多个异步操作进行数组形式的返回值处理,当所有的异步都resolve时,可以执行then操作,当其中一个或多个reject时,所有的异步都会停止调用,直接返回最早发生错误的那个结果
const pa = new Promise((resolve, reject)=>{
setTimeout(function(){
console.log('pa')
resolve('pa')
},3000)
})
const pb= new Promise((resolve, reject)=>{
setTimeout(function(){
console.log('pb')
resolve('pb')
},4000)
})
const pc= new Promise((resolve, reject)=>{
setTimeout(function(){
console.log('pc')
resolve('pc')
},5000)
})
const pd= new Promise((resolve, reject)=>{
setTimeout(function(){
console.log('pd')
reject('pd')
},5000)
})
Promise.all([pa, pb, pc]).then((res)=>{
console.log('成功' +res)
})//3秒后 pa 4秒后pb 5秒后 pc pd 然后输出成功pa,pb,pc
Promise.all([pa, pb, pd]).then((res)=>{
console.log('成功' +res)
}).catch(err=>{
console.log('失败' +err)
})//输出失败pd
4、race的用法, 语法和all()一样,但是返回值有所不同,race根据传入的多个Promise实例,只要有一个实例resolve或者reject,就只返回该结果,其他实例不再执行,也就是说多个异步程序,只返回响应最快的那个异步程序,不论成功或者失败,就把最快响应的返回值返回,后面的异步程序不再执行
const pa = new Promise((resolve, reject)=>{
setTimeout(function(){
console.log('pa')
resolve('pa')
},3000)
})
const pb= new Promise((resolve, reject)=>{
setTimeout(function(){
console.log('pb')
resolve('pb')
},4000)
})
const pc= new Promise((resolve, reject)=>{
setTimeout(function(){
console.log('pc')
resolve('pc')
},5000)
})
const pd= new Promise((resolve, reject)=>{
setTimeout(function(){
console.log('pd')
reject('pd')
},5000)
})
const pe= new Promise((resolve, reject)=>{
setTimeout(function(){
console.log('pe')
reject('pe')
},2000)
})
const pf= new Promise((resolve, reject)=>{
setTimeout(function(){
console.log('pf')
resolve('pf')
},2000)
})
Promise.race([pa, pe, pf]).then(res=>{
console.log('成功' +res)
}).catch(res=>{
console.log('失败' +res)
})
Promise.race([pd, pe]).then().catch(res=>{
console.log('失败' +res)
})//2秒后 输出 失败 + pe
//2秒后 输出 失败 + pe
5、resolve方法,
Promise的resolve方法,用于将非Promise类型的对象,转为Promise对象,这样就可以调用Promise原型对象上的方法了
Promise.resolve(x)
上面的写法等价于new Promise(resolve => { resolve(x)})
resolve的参数分为几种不同的情况:
(1)没有参数,如果没有参数,这直接返回一个resolved状态的Promise对象
const p =Promise.resolve()
相当于
const p= new Promise(resolve =>{
resolve undefined
})
p.then(res=>{
console.log(res)
})//输出 undefined
(2) 参数是一个不具有then方法的对象,或者是一个基数数据类型的值,则Promise.resolve方法返回一个新的 Promise 对象,状态为resolved,值为指定值
const p = Promise.resolve('pro')
p.then((x)=>{
console.log(x)
})//输出 'pro'
(3) 参数是一个具有then方法的对象,Promise.resolve方法会将这个对象转为 Promise 对象,然后就立即执行thenable对象的then方法。
const obj ={
then:function(resolve, reject) {
resolve(100)
}
}
const p=Promise.resolve(obj)
p.then((res)=>{
console.log(res)
})//输出 100
(4)参数是一个Promise对象,那么将原封不动的返回这个Promise对象
6、reject方法
reject与resolve方法基本类似,但是要注意一种情况,就是当参数是一个thenable对象时
const thenable ={
then(resolve, reject) {
reject('出错了');
}
};
Promise.reject(thenable)
.catch(e =>{
console.log(e===thenable)
})//true
7、finally方法,finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。
finally方法的回调函数不接受任何参数,这意味着没有办法知道,前面的 Promise 状态到底是fulfilled还是rejected。这表明,finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果。finally本质上是then方法的特例。
const p = new Promise((resolve, reject)=>{
const a= Math.ceil( Math.random() * 10)
setTimeout(function(){if(a > 5) {
resolve(a)
}else{
reject(a)
}
},3000)
})
p.then(res=>{
console.log(res)
}).catch(err=>{
console.error(err)
}).finally(()=>{
console.log('结束')
})//无论是resolve 还是 reject都会 执行 finally
//finally的 polyfill也很简单
Promise.prototype.finally = function(callback) {
let P= this.constructor;return this.then(
value=> P.resolve(callback()).then(() =>value),
reason=> P.resolve(callback()).then(() => { throwreason })
);
};
promise的状态值_ES6中的Promise的用法总结相关推荐
- 5、this调用语句必须是构造函数中的第一个可执行语句_ES6中的Promise和Generator详解...
简介 ES6中除了上篇文章讲过的语法新特性和一些新的API之外,还有两个非常重要的新特性就是Promise和Generator,今天我们将会详细讲解一下这两个新特性. Promise 什么是Promi ...
- promise的状态值_什么是Promise,Promise的三种状态
什么是Promise对象: Js中进行异步编程的新的解决方案,用于表示一个异步操作的最终完成 (或失败), 及其结果值.. 语法上:promise是一个构造函数 简单来说,promise对象用来封装一 ...
- promise ajax 队列,ES6中的promise,从使用promise封装ajax说起
1为啥要用promise? js是单线程的,理论上所有代码都是同步的,从上到下一行行执行.然而就这样傻傻解析运行js的话,碰到较重的任务时,会阻塞进程,如发送一个用户是否登录验证请求,请求完成响应之前 ...
- ES6中的Promise详解
Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷. 定义 Promise 是一个对象,它用来标识 JavaScri ...
- N-API中的Promise功能的使用
本文介绍N-API中的Promise功能的使用.Promise相关的API一共有四个.在回调里,通过napi_resolve_deferred或napi_reject_deferred修改Promis ...
- 在微信小程序的JS脚本中使用Promise来优化函数处理
在我们传统的Javascript开发函数编写中,我们习惯了回调函数的处理,不过随着回调函数的增多,以及异步处理的复杂性等原因,代码越来越难读,因此诞生了使用Promise来优化JS函数处理的需求,引入 ...
- 浅谈Promise对象在ReactNative中的使用
下面开始: 写在前面 假设现在一个日常开发会遇到这样一个需求:多个接口异步请求,第二个接口依赖于第一个 接口执行完毕之后才能利用数据进行一系列操作.一般会这样写: A.fetchData({url: ...
- ES6中的Promise使用方法与总结
在javascript中,代码是单线程执行的,对于一些比较耗时的IO操作,都是通过异步回调函数来实现的. 但是这样会存在一个问题,当下一个的操作需要上一个操作的结果时,我们只能把代码嵌到上一个操作的回 ...
- ECMAScript 2015(ES6)规范中的promise
ECMAScript 2015(ES6)规范中的promise – 转 概述 Promise 对象用于延迟(deferred) 计算和异步(asynchronous ) 计算..一个Promise对象 ...
最新文章
- js向head中添加js代码
- c++计算eigen随笔(3)-求逆
- 程序员最讨厌的9句话,你可有补充? 1
- python自动解析json_Python语言解析JSON详解
- xman的思维导图快捷键_一图胜千言,免费的多人协作思维导图工具,推荐收藏值得拥有哦...
- khv是什么虚拟服务器,服务器虚拟化vSphere4 vs Hyper-V R2,选择谁?
- STM32F0xx_ADC采集电压配置详细过程
- 大数据分析机器学习(二)之直方图和多元线性回归
- ViewFlipper中放入两个ListView不能拖动的情况
- IIS7.5标识介绍
- 经典数据库sql查询50题
- 在OS X中使用Homebrew
- linux-glibc升级到2.15版本
- Mybatis-Plus SQL注入器的使用
- SpringBoot整合mybatis一直失败差不到数据,解决方案
- opencv-图像处理1 图像基本操作
- 计算机博士毕业致谢,这篇博士论文《致谢》刷屏,句句扎心……
- python+opencv+dlib实现人脸检测与表情识别
- 如何使用Nmap扫描所有TCP和UDP端口?
- 真心话大冒险..你敢接吗?
热门文章
- python 遍历两个列表_python 如何在一个for循环中遍历两个列表
- js删除服务器上文件,js删除服务器文件
- iphone怎么查看wifi密码_WiFi密码忘了怎么办?一秒找回密码
- Parencodings 模拟
- 牛客寒假算法基础训练营3
- 决策树——信息熵的学习笔记
- Win7——Win10系统如何安装Win7系统
- leetcode955. Delete Columns to Make Sorted II
- HashMap遍历有序性问题——map.entrySet()的无序性
- Java:cmd命令行中 错误: 找不到或无法加载主类(从原理出发讲解!)