ES6 标准入门之——Promise

Promise 的含义

  • 出现目的:Promise 是异步编程的一种解决方案,为了解决回调地狱。
  • 特点:
    • 对象状态不受外界影响,只有异步操作结果可以改变状态
    • 一旦状态改变就不会再变
  • 缺点:
    • 无法取消 Promise,一旦新建就会立即执行
    • Promise 内部错误不会抛到外部

基本用法

创建一个 Promise 实例

var promise = new Promise((resolve, reject) => {
  // some code...
  if(/* 异步操作成功 */) {
    resolve(value); // Promise状态从Pending --> Resolved
  } else {
    reject(error); // // Promise状态从Pending --> Rejected
  }
})

Promise.prototype.then()

Promise 实例状态改变时的回调函数,将在当前脚本所有同步任务执行完成后才会执行。

let promise = new Promise((resolve, reject)=>{
  console.log(1);
  resolve();
})
promise.then(() => {
  console.log(3);
})
console.log(2);
// 1 2 3

then()方法包含两个函数参数,第一个是 Resolved 状态的回调函数,第二个(可选)是 Rejected 状态的回调函数。

promise.then((value) => {
  // success
}, (error) => {
  // failure
})

then()方法返回一个新的 Promise 实例,因此可以采用链式写法。

promise.then((res) => {
  return res.doSomething();
}).then((res) => {
  // 若上一个then方法返回的promise状态变为Resolved时调用...
}, (err) => {
  // 若上一个then方法返回的promise状态变为Rejected时调用...
})

Promise.prototype.catch()

用于指定 Promise 实例发生错误时的回调函数。

promise.then(()=> {
  // ...
}).catch((error) => {
  // 捕获promise内部和then方法发生的错误
  console.log(error)
})

建议不要在 then 方法中定义 Rejected 状态的回调函数(即 then 的第二个参数),而应总是使用 catch 方法。因为 Promise 对象的错误具有冒泡属性,会一直向后传递,直到被捕获为止;并且 catch 方法更接近同步写法。

Promise.all()

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

var p = Promise.all([p1, p2, p3]);
p.then(() => {
  // 只有p1, p2, p3都为Resolved,或任一变为rejected才会调用then方法里的回调
}).catch()

p 的状态由 p1, p2, p3 决定,三者都为 Resolved 时 p 的状态才会变为 Resolved,任一 Rejected 时 p 的状态变为 Rejected,此时第一个被 Rejected 的实例的返回值传递给 p 的回调函数。

Promise.race()

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

只要 p1, p2, p3 任一实例改变状态,p 的状态就跟着改变

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

推荐阅读更多精彩内容