javascript 高级编程系列 - Promise

Promise是异步编程的一种解决方案,它是一个对象,可以获取异步操作的消息,它解决了异步编程回调函数的地狱回调问题。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。Promise提供了
统一的API,可以方便的处理各种异步问题。

1. Promsie的生命周期

Promise有3个状态:

  • 进行中(pending)
  • 已完成(fulfilled)
  • 已拒绝(rejected)
    Promise的起始状态是进行中,执行成功会变为已完成,失败则变为已拒绝。在后两种情况下你都可以添加处理程序, 以便当Promise被解决时做出相应的操作。通过then()方法可以添加完成处理程序或拒绝处理程序,通过catch()方法只能
    添加拒绝处理程序。

2. 创建Promise对象

  • 使用Promise构造函数创建
    Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve 和 reject。
// 创建未完成的Promise对象
const promise = new Promise((resolve, reject) => {
  // .... some code
  if(/*异步操作成功**/){
    resolve(value);
  } 
  else {
    reject(error);
  }
});
  • 使用Promise 的静态方法创建
//创建一个已完成的Promise对象
Promise.resolve(2).then((value)=> {
  console.log(value); // 2
});

// 创建一个已拒绝的Promise对象
Promise.reject('has error').catch((value) => {
  console.log(value); // 'has error'
});

3. Promise的使用方法

  • (new Promise((resolve, reject)=>{})).then((value)=>{})
    then 方法接受两个回调函数作为参数,第一个回调函数是Promise对象的状态变为resolved时调用,
    第二个回调函数是Promise对象状态变为rejected时调用。then 方法返回的是一个新的Promise实例,
    因此可以进行链式调用,尤其在处理多个异步请求串行调用时特别方便。
const promise = new Promise((resolve, reject) => { /**some code **/ });
promise.then((value) => {
  // 已完成处理程序
}, (error) => {
  // 已拒绝处理程序
});
  • (new Promise((resolve, reject)=>{})).catch((error)=>{})
    catch方法相当于then 方法的第二个参数,指向rejected时的回调函数。
const promise = new Promise((resolve, reject) => { /**some code **/ });
promise.then((value)=> {
  // handle success
}).catch((error) => {
 // handle error
});

  • (new Promise((resolve, reject)=>{})).finally()
    finally 方法不接受任何参数,因此无法知道此前的promise状态,但是总会被执行。
const promise = new Promise((resolve, reject) => { /**some code **/ });
promise.then((value)=> {
  // handle success
}).catch((error) => {
 // handle error
}).finally(() => {
  // finally handle
});
  • Promise.all([])
    all 方法可以完成并行任务处理,它接受一个数组,数组的每一项都是一个promise对象,
    当数组中的所有promise状态都达到resolved的时候,all方法的状态才会变成resolved,
    如果有一个状态变为了rejected,那么all方法的状态就会变为rejected。
let p1 = new Promise((resolve, reject) => { resolve(1) });
let p2 = new Promise((resolve, reject) => { resolve(2) });
let p3 = new Promise((resolve, reject) => { resolve(3) });
Promise.all([p1, p2, p3]).then((value) => {
  console.log(Array.isArray(value)); // true
  console.log(value[0]); // 1
  console.log(value[1]); // 2
  console.log(value[2]); // 3
}).catch((error) => {
  console.log(error); // error 为rejected状态的promise返回的数据
});

  • Promise.race([])
    race 方法和all一样,接受一个数组,数组的每一项是一个promise对象,当最先执行完
    的事件执行完后,就直接返回改promise对象的值,如果第一个promise 对象的状态变为
    resolved,那么race方法生成的promise对象的状态也就变为resolved,同理,最先执行
    完的promise状态变为rejected,那么它的状态也就是rejected。
let p1 = new Promise((resolve, reject) => { setTimeout(()=> resolve(1),0) });
let p2 = Promise.resolve(2); // p2 最先完成直接就是已完成的状态
let p3 = new Promise((resolve, reject) => { resolve(3) });
Promise.race([p1, p2, p3]).then((value) => {
  console.log(value); // 2
}).catch((error) => {
  console.log(error); // error 为rejected状态的promise返回的数据
});

4. Promise 的缺点

  • 无法取消Promise,一旦新建它就会立即执行,无法中途取消。
  • 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
  • 当处于pending状态时,无法得知目前进展到哪一个阶段。
posted @   箫笛  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示