侃大山——IT技术大杂烩

手撕Promise真面目(手写 promise 代码没有那么难)

2020-11-02  本文已影响0人  酷酷的凯先生

# 前言

看到好多面试题,其中有个问题一直位居高位 -- 手写promise
咱该说不说的,这个没有点金刚钻还真揽不了这瓷器活。
今天就让我们一步一个脚印的走近 Promise 的真相,其实也没想象的那么难

# 大概思路

其实不管是工作中封装组件还是类库,一般都是由简及难,由点到面:
手写Promise也不例外,无外乎就是:

  1. 定义整体结构
  2. Promise 构造函数的实现
  3. Promise .then() / catch() 的实现
  4. Promise .resolve() / reject() 的实现
  5. Promise .all() / race() 的实现

有的大概思路,我们就有了目标和方向,然后就是各个攻破 ~~~

# 定义整体结构

/**
 * 自定义 Promise 函数模块
 */
(function name(window) {
    /**
     * @func Promise 函数模块
     * @param excutor 执行器函数(同步执行)
     */
    function Promise(excutor){

        function resolve(value) {
            
        }

        function reject(reason) {
            
        }

        try{
            excutor(resolve, reject)
        }catch(error){
            reject(error)
        }
    }
    
    /**
     * @func Promise 原型对象中的 then()
     * @param onResoled 成功的回调函数
     * @param onRejected 失败的回调函数
     * @returns  返回一个新的 Promise 对象
     */
    Promise.prototype.then = function (onResoled, onRejected) {
        
    }

    /**
     * @func Promise 原型对象中的 catch()
     * @param onRejected 失败的回调函数
     * @returns 返回一个新的 Promise 对象
     */ 
    Promise.prototype.catch = function (onRejected) {
        
    }

    /**
     * @func Promise 函数对象的 resolve()
     * @param value 成功的回调函数 
     * @returns 返回一个指定结果 value 的成功的 Promise
     */ 
    Promise.resolve = function (value) {
        
    }

     /**
     * @func Promise 函数对象的 reject()
     * @param reason 失败的回调函数
     * @returns 返回一个指定结果 reject 的失败的 Promise
     */ 
    Promise.reject = function (reason) {
        
    }

    /**
     * Peomise 函数对象的 all()
     * @param promises 请求数组
     * @returns 返回一个 Promise
     * @returns 只有 Promise 都成功时才成功,只要有一个失败就失败,并返回失败的 Promise
     */
    Promise.all = function (promises) {
        
    }

    /**
     * Peomise 函数对象的 race()
     * @param promises 请求数组 
     * @returns 返回一个 Promise,其结果由第一个完成的 Promise 决定
     */
    Promise.race = function (promises) {
        
    }

    // 向外暴露 Promise 函数
    window.Promise = Promise;

})(window)

下一篇:Promise 构造函数的实现

上一篇 下一篇

猜你喜欢

热点阅读