• 可以避免多层异步调用嵌套问题
  • Promise 对象提供了简介的API , 值得控制异步操作更容易
  • 异步问题同步化解决方案。
  • MDN
  • ruanyifeng

目录

关于Promise

Promise的特点:

Promise的缺点:

基本用法

Promise.prototype.then()

Promise.prototype.catch()

Promise.prototype.finally()

Promise.all()

Promise.race()

Promise.allSettled()

Promise.any()

Promise.resolve()

Promise.reject(reason)

Promise.try()


关于Promise

表了一个异步操作的最终完成或者失败。

一个 Promise 必然处于以下几种状态之一:

  • 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
  • 已兑现(fulfilled): 意味着操作成功完成。
  • 已拒绝(rejected): 意味着操作失败。

Promise的特点:

  1. 对象的状态不受外界影响。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
  2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果。其状态改变只有两种可能pending->fulfilled/rejected。改变之后状态就凝固了,会一直保持这个结果。

Promise的缺点:

  1. 无法取消Promise。一旦新建就会立即执行,无法中途取消。
  2. 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
  3. 当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

基本用法

  • 实例化promise对象,构造函数中传递函数,该函数用于处理异步任务
  • resolve 和 reject 两个参数用于处理成功和失败两种情况,并通过p.then获取处理结果
        //创造promise实例var p = new Promise(function(resolve, reject) {// 成功时候调用 resolve() // 将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved)// 在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。// 失败时候调用 reject()// 将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),// 在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。// if ( 异步操作成功) {//     resolve()// } else {//     reject()// }});//Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。p.then(function(ret) {// 从resolve得到正常的结果}, function(ret) {// 从reject得到错误信息})
  • Promise 新建后就会立即执行。
  • then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行
        var p1 = new Promise(function(resolve, reject) {console.log('is newPromise');resolve()})p1.then(function(ret) {console.log('isOK');})console.log('同步任务');//is newPromise//同步任务//isOK

Promise.prototype.then()

它的作用是为 Promise 实例添加状态改变时的回调函数。

then方法的第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数,它们都是可选的。

then方法返回的是一个新的Promise实例。因此可以采用链式写法。

        //用箭头函数更清晰点var p1 = new Promise((resolve, reject) => {console.log('is newPromise');resolve('123');})p1.then(ret => {console.log(ret);return 'next';},error => {console.log(error);return 'error';}).then(ret => {console.log(ret);},error => {console.log(error);})

Promise.prototype.catch()

处理一个拒绝的情况。

它的行为与调用Promise.prototype.then(undefined, onRejected) 相同。

  • 一般来说,不要在then()方法里面定义 Reject 状态的回调函数(即then的第二个参数),总是使用catch方法。
        var p2 = new Promise((resolve, reject) => {console.log('is newPromise');reject();})p2.then(() => console.log('catch 前的成功 then'),// () => console.log('catch 前的拒绝 then'), 如果这个存在,就会跳过下面的catch).catch(() => console.log('catch error')).then(() => console.log('catch 后的成功 then'),() => console.log('catch 后的拒绝 then'))//is newPromise//catch error//catch 后的成功 then
  • Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。
  • Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。
        var p3 = new Promise((resolve, reject) => {console.log('is newPromise');resolve();})p3.then(() => sum = x + 1, //x未定义 浏览器无提示).then(() => sum = a + 1, //a未定义).catch(() => console.log('catch'))//is newPromise//catch
  • 一般总是建议,Promise 对象后面要跟catch()方法,这样可以处理 Promise 内部发生的错误。
        var p3 = new Promise((resolve, reject) => {console.log('is newPromise');resolve();})p3.then(() => sum = x + 1,).then(() => sum = a + 1,).catch((error) => {console.log(error); //ReferenceError: x is not defined//catch 中可以再次抛出错误 Uncaught (in promise) ReferenceError: y is not definedy + 2})

Promise.prototype.finally()

用于指定不管 Promise 对象最后状态如何,都会执行的操作。

finally方法的回调函数不接受任何参数,这意味着没有办法知道,前面的 Promise 状态到底是fulfilled还是rejected

这表明,finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果。

finally方法总是会返回原来的值。

Promise.all()

用于将多个 Promise 实例,包装成一个新的 Promise 实例。

pall的状态由可迭代对象决定,分成两种情况。

  • 全部状态都变成fulfilled时,pall的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给pall的回调函数。
        var p1 = new Promise((resolve, reject) => {resolve('isP1');})var p2 = 123213;var p3 = new Promise((resolve, reject) => {setTimeout(resolve, 100, 'foo');})var pall = Promise.all([p1, p2, p3]);pall.then(value => console.log(value)//Array(3) [ "isP1", 123213, "foo" ])
  • 中有一个被rejected,pall的状态就变成rejected.此时第一个被reject的实例的返回值,会传递给pall的回调函数。

        var p1 = new Promise((resolve, reject) => {resolve(x + 1);})var p2 = 123213;var p3 = new Promise((resolve, reject) => {setTimeout(resolve, 100, 'foo');})var pall = Promise.all([p1, p2, p3]);pall.then(value => console.log(value)).catch(error => console.log(error) //ReferenceError: x is not defined)
  • 注意,如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()catch方法。
        var p1 = new Promise((resolve, reject) => {resolve(x + 1);}).catch(error => console.log(error) //ReferenceError: x is not defined//该实例执行完catch方法后,也会变成resolved)var p2 = 123213;var p3 = new Promise((resolve, reject) => {setTimeout(resolve, 100, 'foo');})var pall = Promise.all([p1, p2, p3]);pall.then(value => console.log(value) //Array(3) [ undefined, 123213, "foo" ]).catch(error => console.log(error) )

Promise.race()

将多个 Promise 实例,包装成一个新的 Promise 实例。

  • 只要其中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。
        var p1 = new Promise((resolve, reject) => {resolve(3);}).catch(error => console.log(error))var p2 = 123213;var p3 = new Promise((resolve, reject) => {setTimeout(resolve, 100, 'foo');})var prace = Promise.race([p1, p2, p3]);prace.then(value => console.log(value) // 123213).catch(error => console.log(error) )

Promise.allSettled()

接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。

只有等到所有这些参数实例都返回结果,不管是fulfilled还是rejected,包装实例才会结束。

该方法返回的新的 Promise 实例,一旦结束,状态总是fulfilled,不会变成rejected

  • 这可以确保所有操作都结束。并且获得到他们的结果。
        var p1 = new Promise((resolve, reject) => {resolve(x + 1);})var p2 = 123213;var p3 = new Promise((resolve, reject) => {setTimeout(resolve, 100, 'foo');})var allSettled = Promise.allSettled([p1, p2, p3]);allSettled.then(value => console.log(value) )

Promise.any()

该方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例返回。只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。

Promise.resolve()

将现有对象转为 Promise 对象。

        Promise.resolve('foo')// 等价new Promise(resolve => resolve('foo'))
  • 参数是一个 Promise 实例。原封不动地返回这个实例。
  • 参数是一个具有then方法的对象。立即执行obj的then
        var obj_ = {then : function (resolve, reject) {resolve(1)}}var p = Promise.resolve(obj_);p.then(value => console.log(value) //1)
  • 参数是不带then的对象,或者不是对象。则返回一个新的 Promise 对象,状态为resolved
        var p = Promise.resolve('Hello');p.then(value => console.log(value) //Hello)var obj_ = {text : 'hello'}var p = Promise.resolve(obj_);p.then(value => console.log(value) //Object { text: "hello" })
  • 不带参数。直接返回一个resolved状态的 Promise 对象。
var p = Promise.resolve();

Promise.reject(reason)

返回一个新的 Promise 实例,该实例的状态为rejected

Promise.try()

ES6——Promise笔记相关推荐

  1. ES6语法笔记(ES6~ES11)

    相关代码和笔记已经同步到gitee,需要自取 链接地址:ES6学习笔记 1.let // let声明变量let a;let b,c,d;let e = 100;let f = 110,g = 'qwe ...

  2. # es6 学习笔记

    es6 学习笔记 let变量 let和var用法级别一样 let不能重复声明,但是var可以 var varIns = "A"; var varIns = "B" ...

  3. es6学习笔记-字符串的扩展_v1.0_byKL

    es6学习笔记-字符串的扩展_v1.0 字符的Unicode表示法 JavaScript 允许使用uxxxx的形式表示一个字符,但在 ES6 之前,单个码点仅支持u0000到uFFFF,超出该范围的必 ...

  4. 十分钟快速了解 ES6 Promise

    转载自 十分钟快速了解 ES6 Promise 什么是Promise Promise最早由社区提出并实现,典型的一些库有Q,when, bluebird等:它们的出现是为了更好地解决JavaScrip ...

  5. ES6学习笔记(五):轻松了解ES6的内置扩展对象

    前面分享了四篇有关ES6相关的技术,如想了解更多,可以查看以下连接 <ES6学习笔记(一):轻松搞懂面向对象编程.类和对象> <ES6学习笔记(二):教你玩转类的继承和类的对象> ...

  6. ES6学习笔记(三):教你用js面向对象思维来实现 tab栏增删改查功能

    前两篇文章主要介绍了类和对象.类的继承,如果想了解更多理论请查阅<ES6学习笔记(一):轻松搞懂面向对象编程.类和对象>.<ES6学习笔记(二):教你玩转类的继承和类的对象>, ...

  7. ES6入门笔记(一)

    ES6入门笔记(一) 安装babel 由于浏览器对ES6的支持还不是很好,编写ES6代码前我们要安装一个babel工具将ES6代码编译成ES5代码,用如下命令安装babel: npm install ...

  8. ES6学习笔记04:Set与Map

    ES6学习笔记04:Set与Map JS原有两种数据结构:Array与Object,ES6新增两种数据结构:Set与Map 一.Set数据结构 Set类似于数组,但是成员值不允许重复,因此主要用于数据 ...

  9. ES6学习笔记03:变量的解构赋值

    ES6学习笔记03:变量的解构赋值 如果想从复杂数据结构(数组.对象)中获取某一个数据,可能需要大量的遍历操作才能完成.通过解构赋值,这一过程可以得到简化. 1.字符串的解构赋值 其实,Python也 ...

  10. ES6学习笔记02:let 与 const

    ES6学习笔记02:let 与 const 用var声明的变量会造成全局污染,于是就产生了新的声明方式. 1.let 用let声明变量,必须先声明后使用. 在for循环头里用let定义循环变量i,那么 ...

最新文章

  1. svg text换行_5分钟看懂SVG反爬虫原理与绕过实战 | 知了干货分享
  2. python笔记1:字符串处理函数
  3. js原型、原型链、作用链、闭包全解
  4. 服务发现和注册和Eureka
  5. 心得7--JDBC回顾-批处理案例解说
  6. 集合的所有分割方式---2013年1月28日
  7. zabbix3.0.4安装部署文档(二)
  8. IntelliJ IDEA 如何设置黑色主题,界面字体大小以及内容字体大小
  9. java蓝字代表什么_蓝是什么意思 蓝字五行属什么
  10. 基于安卓实现的模拟定位功能(Android)
  11. C语言 指针访问数组,C语言通过指针引用数组
  12. 电容中那些独有的特性和功能,你有了解吗?
  13. Vue安装及环境配置、开发工具
  14. 管理系统中计算机应用 tps,全国1月自学考试管理系统中计算机应用试题(5)
  15. python 画图 线标注_Python中画图时候的线类型
  16. 2016年人人网笔试题
  17. mac homebrew安装php,Mac Mojava 通过 homebrew 安装 PHP5.6 版本正确姿势
  18. linux firefox flashplayer 升级,在deepin中更新火狐浏览器firefox和firefox-flashplayer的方法...
  19. 算法练习-Apples Prologue
  20. echart 实现地图坐标轴带图标

热门文章

  1. 如何将在立创商场下载的PCB导入工程
  2. 人工智能“剧透”《权游》大结局,第一个“领便当”的居然是ta
  3. 人生的思考——温水中被煮熟的程序员
  4. learn the python in hard way习题16~20的附加习题
  5. IT“茫一代”转型记:创业维艰 苦乐皆有
  6. VS编程,WPF控件增加图片背景的一种方法
  7. Android Studio代码边界线的设置
  8. .netCore微信转账至零钱——V3
  9. 电脑开机无logo,进不了bios
  10. flink SQL与hbase整合