Promise

38 阅读2分钟
  • 异步编程的解决方案,链式操作降低编码难度,代码可读性强

状态

  • promise对象有三种状态:

    • pending(进行中)
    • fulfilled(已成功)
    • rejected(已失败)

特点:

  • 对象的状态不受外界影响,只有异步操作的结果,可以决定当前是哪一种状态
  • 一旦状态改变(从pending变为fulfilled和从pending变为rejected),就不会再变,任何时候都可以得到这个结果

promise实例

const promise = new Promise(function(resolve, reject) {});
  • resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”
  • reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”

实例方法

  • then():状态发生改变时的回调函数。第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数。返回新的promise实例
  • catch():发生错误时的回调。错误具有“冒泡”性质,会一直向后传递,直到被捕获为止
  • finally():不管 Promise 对象最后状态如何,都会执行的操作

构造函数的方法

  • all():将多个 Promise实例,包装成一个新的 Promise实例。const p = Promise.all([p1, p2, p3]);
  • race():有一个实例率先改变状态,p的状态就跟着改变
  • allSettled():都返回结果了,p才完成
  • resolve()
  • reject()
  • try()

手写题

  • 实现Promise.all
/**
 * 参数:由promise实例构成的数组(也有可能不是promise实例)
 * 返回值:返回一个promise新实例
 * 
 * 只有参数数组中所有的promise实例变成fulfilled状态后,promise.all返回的实例才进行fulfilled状态,否则进入rejected状态
 * 
 */
Promise.MyAll = function(promises) {
    return new Promise((resolve, reject) => {
        let arr = [];//接收promises数组中实例的结果
        let count = 0;//用于判断promises数组中被处理的个数,以判断什么时候返回
        promises.forEach((item,index) => {
            Promise.resolve(item).then((res) => {
                arr[i] = res;
                count++;
                if(count === promises.length) resolve(arr);
            }).catch(reject);
        })
    })
}