ES6之Promise对象

一、含义和用法

  • 特点:
    1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
    2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果
  • 优点:有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
  • 缺点:首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,无法得知目前进展到哪一个阶段
  • 用法:
const promise = new Promise(function(resolve, reject) {
  // ... some code
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

其中then方法指定的回调在同步任务执行完毕后才执行

二、Promise.prototype.then()

它的作用是为 Promise 实例添加状态改变时的回调函数,then方法的第一个参数是resolved状态的回调函数第二个参数是rejected状态的回调函数,它们都是可选的。它可以采用链式写法,即前一个then方法返回的结果作为下一个then方法的参数

三、Promise.prototype.catch()

Promise.prototype.catch()方法是.then(null, rejection).then(undefined, rejection)的别名,用于指定发生错误时的回调函数

p.then((val) => console.log('fulfilled:', val))
  .catch((err) => console.log('rejected', err));

// 等同于
p.then((val) => console.log('fulfilled:', val))
  .then(null, (err) => console.log("rejected:", err));

一般来说,推荐使用catch方法,catch可以捕获前面then方法执行中的错误。Promise对象后面要跟catch()方法,这样可以处理Promise内部发生的错误。

四、Promise.prototype.finally()

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

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

五、Promise.all()

用于将多个 Promise 实例,包装成一个新的 Promise 实例,新的Promise对象的状态分成两种:
1)全部成员状态为fulfilled,该Promise为fulfilled;
2)只要成员中有一个状态成rejected,则该Promise为rejected

//promises是包含 6 个 Promise 实例的数组,
const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
  return getJSON('/post/' + id + ".json");
});

Promise.all(promises).then(function (posts) {
  // ...
}).catch(function(reason){
  // ...
});

六、Promise.race()

将多个 Promise 实例,包装成一个新的 Promise 实例,新Promise实例的状态与最先改变状态的成员一致

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

七、Promise.allSettled()

用于确定一组异步操作是否都结束了,该方法接受一个数组作为参数,数组的每个成员都是一个Promise对象,并返回一个新的 Promise 对象,它的回调函数会接收到一个数组作为参数,该数组的每个成员对应前面数组的每个 Promise对象

const resolved = Promise.resolve(42);
const rejected = Promise.reject(-1);

const allSettledPromise = Promise.allSettled([resolved, rejected]);

allSettledPromise.then(function (results) {
  console.log(results);
});
// [
//    { status: 'fulfilled', value: 42 },
//    { status: 'rejected', reason: -1 }
// ]

八、Promise.any()

Promise.all()类似,新的Promise对象的状态分成两种:
1)只要成员中有一个状态成fulfilled,该Promise对象为fulfilled;
2)全部成员为rejected,则该Promise对象为rejected

九、Promise.resolve()

将现有对象转为Promise对象

Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))

Promise.resolve()方法的参数分成四种情况:
1)参数是一个Promise实例
不做任何修改、原封不动地返回这个实例
2)参数是一个具有then方法的对象
Promise.resolve()方法会将这个对象转为 Promise 对象,然后就立即执行该对象的then()方法,不等到本轮循环结束。
3)参数不是具有then()方法的对象,或根本就不是对象
返回一个新的Promise对象,状态为resolved,返回 Promise 实例的状态从一生成就是resolved,所以回调函数会立即执行

const p = Promise.resolve('Hello');

p.then(function (s) {
  console.log(s)
});
// Hello

4)不带有任何参数
直接返回一个resolved状态的Promise对象。

十、Promise.reject()

Promise.resolved类似,返回一个新的 Promise 实例,该实例的状态为rejected

十一、Promise.try()

Promise.try方法让同步函数同步执行,异步函数异步执行,并且让它们具有统一的 API

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

推荐阅读更多精彩内容

  • Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更...
    辽A丶孙悟空阅读 337评论 0 8
  • 首先 阮老师机票http://es6.ruanyifeng.com/#docs/promise1. 含义:Prom...
    小唱同学阅读 822评论 3 3
  • 在了解Promise对象之前,我们有必要先来了解一下什么是回调。其实大家对于回调应该都不陌生。将函数作为参数,当主...
    o0ther阅读 188评论 0 0
  • ES6 Promise对象--将异步代码像同步代码那些书写 博客说明 文章所涉及的资料来自互联网整理和个人总结,意...
    归子莫阅读 401评论 0 1
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,055评论 0 4