天天看点

Promise实现Promise的认识Promise的构造函数resolve、reject报错处理this绑定结束语

promise是前端的必修课,他的必修不单单是使用上,在原理上的理解,有助于对整个前端技术的提升。今天就让我们一起实现一个promise吧

Promise的认识

promise的标准中,只有对then的说明,并没有其他常见静态属性的记录。例如:我们常常使用的catch、all等,都不在标准规范之内约定。这其中需要注意的是then返回的是一个Promise并不是简单的内容或者undefined。此外,Promise还有三种状态。分别是开始时候的pending,正常返回时的fulfilled,异常情况下的rejected。

Promise的构造函数

因为Promise规范中没有明确说明构造函数的内容。所以我们根据上面对Promise的认识来补齐他的内容。首先,Promise构造函数需要传入一个函数,并在这个函数内实现同步或者异步的操作。那么,我们可以使用es5代码如下:

function myPromise(cb) {
    var me = this;
    me.status = 'pending' // 初始状态
    me.data = undefined   // 初始值
    cb(resolve, reject) // 执行cb并传入参数
}
           

es6代码如下:

class myPromise {
    constructor(cb) {
        this.status = 'pending';
        this.data = undefined;
        cb(resolve, reject)
    }
}
           

resolve、reject报错处理

当原生的Promise在resolve和reject中报错时候,会抛出异常。因此在我们的构造函数中也要加上对错误的处理。这里可以将resolve、reject使用try catch包裹这样就不管任何一种错误都能被捕捉到。实现如下:

try { // 考虑执行cb的过程中可能出错,所以用try/catch块封装起来,而且出错后要reject掉这个Promise消息
    cb(resolve, reject) // 执行executor
  } catch(e) {
    reject(e)
  }
           

this绑定

cb(resolve.bind(this), reject.bind(this))
           

结束语

继续阅读