ECMAScript 6 入门--Promise 对象

ECMAScript 6 入门--Promise 对象

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

简单解读

Promise从字面意义就是承诺。而承诺的特点是,一旦定下就不可以改变承诺的内容,也无法取消。所以Promise具有以下几个特点

1. 对象不会受到外界的影响,一诺千金不可改变。而Promise有三种状态,pending(进行中)、fulfilled(已成功)和rejected(已失败)。这也同时对应了Promise常用的三个函数,new Promise()(进行中)、resolv()(已成功)和reject()(已失败)。

2. 承诺都是链式的,比如:我承诺(Promise)我王境泽绝对不吃你一口饭!,成功了(fulfilled)我就是铁骨铮铮,否则(rejected)我就死外边从这儿跳下去。

基本用法

var promise = new Promise(function(resolve,reject){
    if(wjz.eat()){
        // 失败
        reject("真香!");
    }else{
        // 成功
        resolve("铁骨铮铮王境泽!");
    }
});
promise.then(function(json) {
    return json;
}).then(function(post) {
    // ..."铁骨铮铮王境泽!"
    console.log(post);
}).catch(function(err){
    // ..."真香!"
    console.log(err);
});

这一段伪代码表明了以下几点

  1. Promise对象可以链式调用。

  2. 每一个then函数都会返回一个新的Promise对象,并以返回值作为下一个then中的函数的参数。

  3. 如果不是调用reject方法,而是直接抛错。那么catch当中的err会是错误类型本身,而调用reject方法则err会是其调用的参数。

值得注意的一点是,当你调用了reject()或者resolve()来判定这一个承诺是成功了还是失败了之后,就意味着这一个承诺的状态已定承诺结束。之后即使在resolve("铁骨铮铮王境泽!")之后抛错也对外界不会有任何影响,但是之后的代码会被执行。

Promise.prototype.finally()

finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。

简单来说 就和try、catch、finally是差不多的。

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});

值得注意的是,对于finally来说,并不会在意这一次承诺是否执行成功了,还是执行失败了。也因此它的回调函数不接受任何参数

其实无论是catch还是finally,本质上都是特殊实现的then。

Promise.all()

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

all方法接受一个Promise对象组成的数组(Promise.all方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。)。

const p = Promise.all([p1, p2, p3]);

p的状态由p1、p2、p3决定,分成两种情况。

(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

简单来说就是all方法会把多个Promise对象合并为一个。当所有Promise完成的时候就会触发p集合对象的then的回调,而其中任意一个方法失败则会调用p的catch回调方法。

作用实例在于异步调用多个API获得全部获得结果后再进行其他操作。

注意,如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法。

Promise.race()

race,字面上的意思是竞赛。

Promise.race()方法同样是对对个Promise对象合并的操作。

综合上面两点来看很明显race和all相反,race的作用就在于当Promise集合当中的其中一个Promise执行完成的时候,集合就变成了已完成状态了。而集合当中所有的Promise变成rejected之后才会使集合变成rejected状态。

Promise.resolve()

将现有对象转换成一个Promise对象。

上方的all和race方法,如果数组当中的对象不是promise对象的话会先调用resolve方法转换成Promise对象。

Promise.try()

这个方法主要是为了解决,当你不想异步,但是又想利用Promise的流式解决方法。

你可能会想可以直接使用Promise解决问题,例如:

    Promise.resolve().then(f)

但是这样可能会导致一个问题,如果f是同步函数,那么它会在本轮事件循环的末尾执行。这样你就丢失了他的同步特性。

所以你可以采用try来解决:

Promise.try(f).then((result)=>{
    console.log(result);
}).catch((err)=>{
    console.log(err);
})

事实上,Promise.try就是模拟try代码块,就像promise.catch模拟的是catch代码块。

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

推荐阅读更多精彩内容

  • Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函...
    neromous阅读 8,706评论 1 56
  • 一、Promise的含义 Promise在JavaScript语言中早有实现,ES6将其写进了语言标准,统一了用法...
    Alex灌汤猫阅读 824评论 0 2
  • 原文地址:http://es6.ruanyifeng.com/#docs/promise Promise 的含义 ...
    AI云栈阅读 873评论 0 7
  • 目录:Promise 的含义基本用法Promise.prototype.then()Promise.prototy...
    BluesCurry阅读 1,494评论 0 8
  • 节假日里,出来玩的有很多是亲子游,因此也看了很多孩子的表现。我认为孩子的礼仪学习越早越好,让好习惯提早培养,随时间...
    EIC喵姐阅读 150评论 0 0