第一部分、什么是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的用法总结相关推荐

  1. 5、this调用语句必须是构造函数中的第一个可执行语句_ES6中的Promise和Generator详解...

    简介 ES6中除了上篇文章讲过的语法新特性和一些新的API之外,还有两个非常重要的新特性就是Promise和Generator,今天我们将会详细讲解一下这两个新特性. Promise 什么是Promi ...

  2. promise的状态值_什么是Promise,Promise的三种状态

    什么是Promise对象: Js中进行异步编程的新的解决方案,用于表示一个异步操作的最终完成 (或失败), 及其结果值.. 语法上:promise是一个构造函数 简单来说,promise对象用来封装一 ...

  3. promise ajax 队列,ES6中的promise,从使用promise封装ajax说起

    1为啥要用promise? js是单线程的,理论上所有代码都是同步的,从上到下一行行执行.然而就这样傻傻解析运行js的话,碰到较重的任务时,会阻塞进程,如发送一个用户是否登录验证请求,请求完成响应之前 ...

  4. ES6中的Promise详解

    Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷. 定义 Promise 是一个对象,它用来标识 JavaScri ...

  5. N-API中的Promise功能的使用

    本文介绍N-API中的Promise功能的使用.Promise相关的API一共有四个.在回调里,通过napi_resolve_deferred或napi_reject_deferred修改Promis ...

  6. 在微信小程序的JS脚本中使用Promise来优化函数处理

    在我们传统的Javascript开发函数编写中,我们习惯了回调函数的处理,不过随着回调函数的增多,以及异步处理的复杂性等原因,代码越来越难读,因此诞生了使用Promise来优化JS函数处理的需求,引入 ...

  7. 浅谈Promise对象在ReactNative中的使用

    下面开始: 写在前面 假设现在一个日常开发会遇到这样一个需求:多个接口异步请求,第二个接口依赖于第一个 接口执行完毕之后才能利用数据进行一系列操作.一般会这样写: A.fetchData({url: ...

  8. ES6中的Promise使用方法与总结

    在javascript中,代码是单线程执行的,对于一些比较耗时的IO操作,都是通过异步回调函数来实现的. 但是这样会存在一个问题,当下一个的操作需要上一个操作的结果时,我们只能把代码嵌到上一个操作的回 ...

  9. ECMAScript 2015(ES6)规范中的promise

    ECMAScript 2015(ES6)规范中的promise – 转 概述 Promise 对象用于延迟(deferred) 计算和异步(asynchronous ) 计算..一个Promise对象 ...

最新文章

  1. js向head中添加js代码
  2. c++计算eigen随笔(3)-求逆
  3. 程序员最讨厌的9句话,你可有补充? 1
  4. python自动解析json_Python语言解析JSON详解
  5. xman的思维导图快捷键_一图胜千言,免费的多人协作思维导图工具,推荐收藏值得拥有哦...
  6. khv是什么虚拟服务器,服务器虚拟化vSphere4 vs Hyper-V R2,选择谁?
  7. STM32F0xx_ADC采集电压配置详细过程
  8. 大数据分析机器学习(二)之直方图和多元线性回归
  9. ViewFlipper中放入两个ListView不能拖动的情况
  10. IIS7.5标识介绍
  11. 经典数据库sql查询50题
  12. 在OS X中使用Homebrew
  13. linux-glibc升级到2.15版本
  14. Mybatis-Plus SQL注入器的使用
  15. SpringBoot整合mybatis一直失败差不到数据,解决方案
  16. opencv-图像处理1 图像基本操作
  17. 计算机博士毕业致谢,这篇博士论文《致谢》刷屏,句句扎心……
  18. python+opencv+dlib实现人脸检测与表情识别
  19. 如何使用Nmap扫描所有TCP和UDP端口?
  20. 真心话大冒险..你敢接吗?

热门文章

  1. python 遍历两个列表_python 如何在一个for循环中遍历两个列表
  2. js删除服务器上文件,js删除服务器文件
  3. iphone怎么查看wifi密码_WiFi密码忘了怎么办?一秒找回密码
  4. Parencodings 模拟
  5. 牛客寒假算法基础训练营3
  6. 决策树——信息熵的学习笔记
  7. Win7——Win10系统如何安装Win7系统
  8. leetcode955. Delete Columns to Make Sorted II
  9. HashMap遍历有序性问题——map.entrySet()的无序性
  10. Java:cmd命令行中 错误: 找不到或无法加载主类(从原理出发讲解!)