zoukankan      html  css  js  c++  java
  • 手写Promise A+ 规范

    基于ES6语法手写promise A+ 规范,源码实现

    class Promise {
        constructor(excutorCallBack) {
            this.status = 'pending';
            this.value = undefined;
            this.fulfilledAry = [];
            this.rejectedAry = [];
    
            //=>执行EXCUTOR(异常捕获)
            let resolveFn = result => {
                let timer = setTimeout(() => {
                    clearTimeout(timer);
                    if (this.status !== 'pending') return;
                    this.status = 'fulfilled';
                    this.value = result;
                    this.fulfilledAry.forEach(item => item(this.value));
                }, 0);
            };
            let rejectFn = reason => {
                let timer = setTimeout(() => {
                    clearTimeout(timer);
                    if (this.status !== 'pending') return;
                    this.status = 'rejected';
                    this.value = reason;
                    this.rejectedAry.forEach(item => item(this.value));
                }, 0);
            };
            try {
                excutorCallBack(resolveFn, rejectFn);
            } catch (err) {
                //=>有异常信息按照REJECTED状态处理
                rejectFn(err);
            }
        }
    
        then(fulfilledCallBack, rejectedCallBack) {
            //=>处理不传递的状况
            typeof fulfilledCallBack !== 'function' ? fulfilledCallBack = result => result : null;
            typeof rejectedCallBack !== 'function' ? rejectedCallBack = reason => {
                throw new Error(reason instanceof Error ? reason.message : reason);
            } : null;
    
            //=>返回一个新的PROMISE实例
            return new Promise((resolve, reject) => {
                this.fulfilledAry.push(() => {
                    try {
                        let x = fulfilledCallBack(this.value);
                        x instanceof Promise ? x.then(resolve, reject) : resolve(x);
                    } catch (err) {
                        reject(err);
                    }
                });
                this.rejectedAry.push(() => {
                    try {
                        let x = rejectedCallBack(this.value);
                        x instanceof Promise ? x.then(resolve, reject) : resolve(x);
                    } catch (err) {
                        reject(err);
                    }
                });
            });
        }
    
        catch(rejectedCallBack) {
            return this.then(null, rejectedCallBack);
        }
    
        static all(promiseAry = []) {//=>Promise.all()
            return new Promise((resolve, reject) => {
                //=>INDEX:记录成功的数量 RESULT:记录成功的结果
                let index = 0,
                    result = [];
                for (let i = 0; i < promiseAry.length; i++) {
                    //=>promiseAry[i]:
                    //每一个需要处理的PROMISE实例
                    promiseAry[i].then(val => {
                        index++;
                        result[i] = val;//=>索引需要和promiseAry对应上,保证结果的顺序和数组顺序一致
                        if (index === promiseAry.length) {
                            resolve(result);
                        }
                    }, reject);
                }
            });
        }
    }
    
    module.exports = Promise;
  • 相关阅读:
    BMIDE开发Soa Services提供给AWC端调用
    TC的Bom行解包和打包的方法
    Java判断一个对象是否是数组
    eclipse里快捷键alt+/不起作用的问题
    脚本实现dwg转PDF的方法--》右键
    Postman设置环境变量
    js滚轮事件兼容写法
    转换时间戳,兼容webkit和IE
    根据对象,返回'&键名=值&键名=值‘形式
    layui 时间插件laydate中动态设置改变min和max值
  • 原文地址:https://www.cnblogs.com/jiajialove/p/11990738.html
Copyright © 2011-2022 走看看