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;
  • 相关阅读:
    php远程图片抓取存放到本地路径并生成缩略图
    Linux下cron的使用
    centos6.3编译安装Apache2.4.3+PHP5.4.8+Mysql5.5.8
    CentOS 6.3 安装以及配置Apache php mysql
    用avalon和jquery做基础网页导航
    javascrip基本概念(三)
    grunt学习笔记(一)
    前端项目目录管理-部署结构
    javascript基本概念(二)
    avalon学习笔记ui篇-如何将avalon默认的amd模型禁止,以及用require重写。
  • 原文地址:https://www.cnblogs.com/jiajialove/p/11990738.html
Copyright © 2011-2022 走看看