ES6 promise对象

对于promise对象的介绍有全面的文档支持,十分适合初学者学习:
阮一峰的es6入门

Promise特点###

  • promise新建后会立即执行,resolve/reject执行哪一个是需要我们判断的
  • 回调函数一旦执行,表明状态要么Resolved,要么Rejected。该promise对象已经定型,再调用回调只会返回既定结果
  • 如果异步操作异常,状态就会变成rejected

SetTimeout的第三个参数###

其中文档的第一个例子,此处的setTimeout()有3个参数,代码可知,timeout()返回一个promise对象,并且在ms之后执行setTimeout,setTimeout的第三个参数作为resolve的参数传入:

Resolve/Reject参数###

node中运行如下代码,这里需要注意:在promise对象中resolve()的参数,会被传递给回调函数,即图中的res.success和result

异步操作嵌套###

如下图示,p1p2都为promise对象,但p1是p2的resolve参数,p2会等待p1有结果后执行
。现在对于p2两种结果的回调函数都存在,当不存在reject的回调时,会转入catch中,进行捕获

Promise的链式调用###

promise的then会返回一个新的promise对象,故其可以链式调用,下图可见,500ms的定时任务,resolved被传入第一个then(),其后返回了resolvedprom1,在由第二个then()输出结果

Promise中的catch()###

  • 回调执行错误,状态变成reject,会执行catch。then()里抛出异常也会执行catch
  • 一旦状态改变完成,再抛出异常就不会被catch
  • Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止
  • Promise对象抛出的错误不会传递到外层代码,只能用catch来捕捉
  • catch()中还能再抛出错误,但不会被自己捕获

Catch的链式调用###

catch()返回的也是一个promise对象,故catch后面可以链式调用then()方法,不过catch只能捕获自己之前的异常,下图中第一个catch就没有捕获到异常


Promise.all()###

  • promise.all()可接受一个数组为参数,每个元素为promise对象,类似于与运算,只有所有promise状态都为resolve时,Promise.all()才会执行resolve
  • 如果有promise等待,Promise.all()亦会等待

Promise.race()###

与promise.all()相反,只要有一个promise状态改变,就会立即返回给promise.race(),<u>该promise的返回值会传递给回调函数</u>

若干Promise.resolve()###

一般用promise.resolve()将现有对象转为Promise对象,几种情况如下

![]57B4.png](http://upload-images.jianshu.io/upload_images/1759843-66624864e20b0ac0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

若干Promise.reject()###

promise.reject()也会返回一个promise对象,原理同上。不同的部分:对thenable的对象调用reject()后不会执行其then()方法,图中返回的e即为thenable对象

done()和final()的实现

  • done():promise对象内部错误不会冒泡至全局,因为catch()、then()返回的都是promise对象,故最后一个总有可能无法捕获,done()就是为了处理这种情况
  • final():无论promise的结果如何都会执行,promise在reject之后只会调用一次回调,后续的then中的reject不会执行,final()是用于处理该种情况

~

最后附上demo链接:https://github.com/LiuYashion/ECMAScript6/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Promise的含义:   Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和...
    呼呼哥阅读 2,200评论 0 16
  • 1. 首先创建Promise实例,Promise实例生成以后,可以用then方法分别指定Resolved状态和Re...
    竹溪穆褕阅读 456评论 0 2
  • 前言 在Promise之前,js的异步编程都是采用回调函数和事件的方式。但是这种编程方式在处理复杂业务的情况下,很...
    卓三阳阅读 858评论 0 1
  • Promiese 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,语法上说,Pr...
    雨飞飞雨阅读 3,392评论 0 19
  • 忽然出现在我生命里的恶魔 三岁多的我,有一天忽然发现见到妈妈的次数与时间越来越少,那个年纪的我应该也挺需要爸妈的照...
    树洞不说话阅读 263评论 0 0