手写一个Promise


Promise的用途

1. 用于异步计算
2. 可以将异步操作序列化,按照期望的顺序进行执行, 返回符合预期的结果
3. 在对象之间传递和操作Promise,帮助我们处理队列

产生的原因

  .JavaScript包含大量异步操作。
  js为交互检查表单而生。操作DOM

  事件监听也是一种异步操作
  ajax回调
  jquery,$() 页面加载完成后回调
  Node.js 无阻塞高并发是Node.js的招牌。异步是其保障,依赖大量回调函数

  1. 异步回调的问题,回调地狱。难以维护
  2. 无法正常使用return, throw异步回调不能使用try catch捕获错误, 因为函数执行入栈出栈函数不在一个栈里面。
  3. 无法正常检索堆栈信息
  4 异步无法判断回调的函数是否执行完成,当声明局部变量时,可能会被闭包其他函数修改,导致变量的值不准确。多个回调无法建立联系。

Promise的设计
参数是一个执行器 两个回调函数参数,一个是处理完成 一个是处理出错
如果成功会then的函数,如果识别会执行catch的执行函数。
三个状态 pending fulfilled rejected
当状态改变 触发then的响应的后续步骤,状态改变后不能再次被改变。
Promise一经创建执行器会立刻执行,执行是异步的过程。等待then的处理的函数。

then,可以链式调用 因为promise的then返回的是promise实例。
当我们出现嵌套then,建议把其展开,可读性会更好


回调方法实现promise
let MyPromise = function(executor) {
    let resolve = function(res) {
        this.success(res);
    };

    let reject = function(err) {
        this.error(err);
    };

    this.then = function(cb) {
        this.success = cb;
        return this;
    };

    this.catch = function(cb) {
        this.error = cb;
    };

    executor(resolve.bind(this), reject.bind(this));
}

let test = function(n) {
    return new MyPromise((resolve, reject) => {
        setTimeout(() => {
            if(n < 5) {
                 resolve('成功')
            }else{
                 reject('失败')
            }
        }, 1000)
    })
}


let n = (Math.random() * 10).toFixed(0);

test (n).then(res => {
    console.log(res)
})
.catch(err => {
    console.log(err)
})

  

 
posted @ 2021-03-14 20:06  姓蜀名黍  阅读(73)  评论(0)    收藏  举报