ES6 - Promise

基本概念

Promise 对象有三种状态:pending,resolved,rejected
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态
一旦状态改变,就不会再变,任何时候都可以得到这个结果
Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled ,从 pending 变为 rejected

Promise.prototype.catch()

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

p.then(() => {})
  .catch(() => {});

// 等同于
p.then(() => {})
  .then(null, () => {});

Promise 内部的错误不会影响到 Promise 外部的代码

p = new Promise((resolve, reject) => {
  resolve(x + 1)
})
p.then(() => console.log(11))

setTimeout(() => { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123

Promise.prototype.finally()

用于指定不管 Promise 对象最后状态如何,都会执行的操作
其实是个语法糖:

promise.finally(() => {
  // 语句
});

// 等同于
promise.then(
  result => {
    // 语句
    return result;
  },
  error => {
    // 语句
    throw error;
  }
);

Promise.all()

用于将多个 Promise 实例,包装成一个新的 Promise 实例,参数需要具有 Iterator 接口

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的回调函数。

Promise.race()

将多个 Promise 实例,包装成一个新的 Promise 实例

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

上面代码中,只要 p1、p2、p3 之中有一个实例率先改变状态,p 的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给 p 的回调函数

Promise.resolve()

作用:将现有对象转为 promise 对象
Promise.resolve 等价于下面的写法

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

如果参数是 promise 实例,那么 Promise.resolve 将原封不动地返回这个实例。

注意:立即 resolve 的 Promise 对象,是在本轮“事件循环”(event loop)的结束时,而不是在下一轮“事件循环”的开始时。

setTimeout(function () {
  console.log('three');
}, 0);

Promise.resolve().then(function () {
  console.log('two');
});

console.log('one');

// one
// two
// three

Promise.reject()

作用:返回一个新的 Promise 实例,该实例的状态为 rejected

const p = Promise.reject('出错了');
// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))

p.then(null, function (s) {
  console.log(s)
});
// 出错了

注意:Promise.reject() 方法的参数,会原封不动地作为 reject 的理由,变成后续方法的参数。这一点与 Promise.resolve 方法不一致。

Promise.try()

Promise.try(database.users.get({id: userId}))
  .then(...)
  .catch(...)

给同步和异步提供统一的错误处理

其它

new Promise(() => { }),这条语句执行后,传入的函数就会执行。

你可能感兴趣的:(ES6 - Promise)