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

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

推荐阅读更多精彩内容

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