• ES6-promise简单实现


    // 从promise的概念和使用分析:
    /**
    * 一句话:利用3个状态,当执行一次后状态改变同时执行then中当所有事件;状态改变后,不会在执行 * 1. 构造函数 * 2. 3个状态:PENDING,FULFILLED,REJECTED,状态一旦确定为FULFILLED,REJECTED就不会在更改 * 3. 参数是函数,promise内部会给作为参数的函数,传递2个参数,resolve,reject * 4. resolved是一个函数和reject是一个函数,都是微任务,这样才能确保先于then执行 * 5. promise执行成功会调用reslove,reslove对应then的第一个参数 * 6. promise执行失败会调用reject,reject对应then的第二个参 * 7. then可以有多个,所以我们需要在then中建立二个事件队列一个是reslove的,一个是reject的, * 8. 当reslove被调用时执行事件队列 *
    */ class MyPromise { // 3个状态:PENDING,FULFILLED,REJECTED static PENDING = "PENDING" static FULFILLED = "FULFILLED" static REJECTED = "REJECTED" constructor(handlerFn) { //定义初始的状态值 this.state = MyPromise.PENDING; //promise内部会给作为参数的函数,传递2个参数,resolve,reject handlerFn(this._resolve.bind(this), this._reject.bind(this)); //获取reslove传入的值 this.params; //建立二个事件队列一个是reslove的,一个是reject的, this.resloveEventList = []; this.rejectEventList = []; } _resolve(val) { //h5提供的微任务message,吧resolve变为微任务 window.addEventListener('message', _ => { //当reslove被调用时执行事件队列,状态一旦确定为FULFILLED,REJECTED就不会在更改,意味着不会在执行 if (this.state !== MyPromise.PENDING) { return }; this.state = MyPromise.FULFILLED; this.params=val; //执行事件队列中的所有内容 this.resloveEventList.forEach((reslove) => { reslove(this.params) }); this.resloveEventList.length = 0 }) //出发message window.postMessage("") } _reject(val) { window.addEventListener('message', _ => { //当reslove被调用时执行事件队列,状态一旦确定为FULFILLED,REJECTED就不会在更改,意味着不会在执行 if (this.state !== MyPromise.PENDING) { return }; this.state = MyPromise.REJECTED; this.params=val; //执行事件队列中的所有内容 this.rejectEventList.forEach((reslove) => { reslove(this.params) }); this.rejectEventList.length = 0 }) //出发message window.postMessage("") } //调用then then(resloveSucc, rejectFaile) { //then可以有多个,所以我们需要在then中建立二个事件队列一个是reslove的,一个是reject的, if (typeof resloveSucc == 'function') { this.resloveEventList.push(resloveSucc); } if (typeof rejectFaile == 'function') { this.rejectEventList.push(rejectFaile); } } }

    调用测试:

     <script src="./promise.js"></script>
        <script>
        var p=new MyPromise((reslove,rejuect)=>{
            setTimeout(()=>{
                console.log(1000);
                reslove(111)
            },2000)
        }).then((val)=>{
            console.log(val);
        })
    输出结果1000,111
  • 相关阅读:
    个人互联网获得证书
    吴恩达Coursera, 机器学习专项课程, Machine Learning:Supervised Machine Learning: Regression and Classification第二周编程作业
    llvm 源码编译
    Linux C++ 开发简历
    仓库人员管理:承包制与绩效考核
    呆滞物料的产生与应对策略
    提升货物周转率的四种策略
    一文看清库存管理价值和数据分析维度
    WMS系统对于制造业的提升效益
    深入分析仓储成本,努力寻找赢利点
  • 原文地址:https://www.cnblogs.com/liuXiaoDi/p/12593270.html
Copyright © 2020-2023  润新知