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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

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