zoukankan      html  css  js  c++  java
  • promise自定义封装

    初始结构搭建:

    index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Promise-封装 | 1 - 初始结构搭建</title>
        <script src="./promise.js"></script>
    </head>
    <body>
        <script>
            let p = new Promise((resolve, reject) => {
                resolve('OK');
            });
    
            p.then(value => {
                console.log(value);
            }, reason=>{
                console.warn(reason);
            })
        </script>
    </body>
    </html>

    promise.js:

    function Promise(executor){
    
    }
    
    //添加 then 方法
    Promise.prototype.then = function(onResolved, onRejected){
    
    }





    resolve与reject结构搭建:

    index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Promise-封装 | 2 - resolve 与 reject </title>
        <script src="./promise.js"></script>
    </head>
    <body>
        <script>
            let p = new Promise((resolve, reject) => {
                resolve('OK');
            });
    
            p.then(value => {
                console.log(value);
            }, reason=>{
                console.warn(reason);
            })
        </script>
    </body>
    </html>

    promise.js:

    //声明构造函数
    function Promise(executor){
        //resolve 函数
        function resolve(data){
    
        }
        //reject 函数
        function reject(data){
    
        }
    
        //同步调用『执行器函数』
        executor(resolve, reject);
    }
    
    //添加 then 方法
    Promise.prototype.then = function(onResolved, onRejected){
    
    }






     3-resolve与reject函数实现

    index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Promise-封装 | 2 - resolve 与 reject </title>
        <script src="./promise.js"></script>
    </head>
    <body>
        <script>
            let p = new Promise((resolve, reject) => {
                // resolve('OK');
                reject("error");
            });
    
            console.log(p);
    
            // p.then(value => {
            //     console.log(value);
            // }, reason=>{
            //     console.warn(reason);
            // })
        </script>
    </body>
    </html>

    promise.js:

    //声明构造函数
    function Promise(executor){
        //添加属性
        this.PromiseState = 'pending';
        this.PromiseResult = null;
        //保存实例对象的 this 的值
        const self = this;// self _this that
        //resolve 函数
        function resolve(data){
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'fulfilled';// resolved
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
        }
        //reject 函数
        function reject(data){
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'rejected';// 
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
        }
    
        //同步调用『执行器函数』
        executor(resolve, reject);
    }
    
    //添加 then 方法
    Promise.prototype.then = function(onResolved, onRejected){
    
    }






    throw抛出错误改变状态

    index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Promise-封装 | 4 - throw 抛出异常改变状态 </title>
        <!-- <script src="./promise.js"></script> -->
    </head>
    <body>
        <script>
            let p = new Promise((resolve, reject) => {
                // resolve('OK');
                // reject("error");
                //抛出异常
                throw "error";
            });
    
            console.log(p);
    
            // p.then(value => {
            //     console.log(value);
            // }, reason=>{
            //     console.warn(reason);
            // })
        </script>
    </body>
    </html>

    promise.js:

    //声明构造函数
    function Promise(executor){
        //添加属性
        this.PromiseState = 'pending';
        this.PromiseResult = null;
        //保存实例对象的 this 的值
        const self = this;// self _this that
        //resolve 函数
        function resolve(data){
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'fulfilled';// resolved
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
        }
        //reject 函数
        function reject(data){
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'rejected';// 
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
        }
        try{
            //同步调用『执行器函数』
            executor(resolve, reject);
        }catch(e){
            //修改 promise 对象状态为『失败』
            reject(e);
        }
    }
    
    //添加 then 方法
    Promise.prototype.then = function(onResolved, onRejected){
    
    }






    状态只能修改一次

     index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Promise-封装 | 5 - 状态只能修改一次 </title>
        <script src="./promise.js"></script>
    </head>
    <body>
        <script>
            let p = new Promise((resolve, reject) => {
                reject("error");
                resolve('OK');
                //抛出异常
                // throw "error";
            });
    
            console.log(p);
        </script>
    </body>
    </html>

    promise.js:

    //声明构造函数
    function Promise(executor){
        //添加属性
        this.PromiseState = 'pending';
        this.PromiseResult = null;
        //保存实例对象的 this 的值
        const self = this;// self _this that
        //resolve 函数
        function resolve(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'fulfilled';// resolved
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
        }
        //reject 函数
        function reject(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'rejected';// 
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
        }
        try{
            //同步调用『执行器函数』
            executor(resolve, reject);
        }catch(e){
            //修改 promise 对象状态为『失败』
            reject(e);
        }
    }
    
    //添加 then 方法
    Promise.prototype.then = function(onResolved, onRejected){
    
    }






    then方法执行回调

     index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Promise-封装 | 7 - 异步任务 then 方法实现 </title>
        <script src="./promise.js"></script>
    </head>
    <body>
        <script>
            //实例化对象
            let p = new Promise((resolve, reject) => {
                setTimeout(() => {
                    // resolve('OK');
                    reject("error");
                }, 1000);
            });
    
            p.then(value => {
                console.log(value);
            }, reason=>{
                console.warn(reason);
            });
    
            console.log(p);
        </script>
    </body>
    </html>

    promise.js:

    //声明构造函数
    function Promise(executor){
        //添加属性
        this.PromiseState = 'pending';
        this.PromiseResult = null;
        //声明属性
        this.callback = {};
        //保存实例对象的 this 的值
        const self = this;// self _this that
        //resolve 函数
        function resolve(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'fulfilled';// resolved
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
            //调用成功的回调函数
            if(self.callback.onResolved){
                self.callback.onResolved(data);
            }
        }
        //reject 函数
        function reject(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'rejected';// 
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
            //执行回调
            if(self.callback.onResolved){
                self.callback.onResolved(data);
            }
        }
        try{
            //同步调用『执行器函数』
            executor(resolve, reject);
        }catch(e){
            //修改 promise 对象状态为『失败』
            reject(e);
        }
    }
    
    //添加 then 方法
    Promise.prototype.then = function(onResolved, onRejected){
        //调用回调函数  PromiseState
        if(this.PromiseState === 'fulfilled'){
            onResolved(this.PromiseResult);
        }
        if(this.PromiseState === 'rejected'){
            onRejected(this.PromiseResult);
        }
        //判断 pending 状态
        if(this.PromiseState === 'pending'){
            //保存回调函数
            this.callback = {
                onResolved: onResolved,
                onRejected: onRejected
            }
        }
    }






     7-异步任务下then方法执行回调


    index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Promise-封装 | 7 - 异步任务 then 方法实现 </title>
        <script src="./promise.js"></script>
    </head>
    <body>
        <script>
            //实例化对象
            let p = new Promise((resolve, reject) => {
                setTimeout(() => {
                    // resolve('OK');
                    reject("error");
                }, 1000);
            });
    
            p.then(value => {
                console.log(value);
            }, reason=>{
                console.warn(reason);
            });
    
            console.log(p);
        </script>
    </body>
    </html>

    promise.js:

    //声明构造函数
    function Promise(executor){
        //添加属性
        this.PromiseState = 'pending';
        this.PromiseResult = null;
        //声明属性
        this.callback = {};
        //保存实例对象的 this 的值
        const self = this;// self _this that
        //resolve 函数
        function resolve(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'fulfilled';// resolved
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
            //调用成功的回调函数
            if(self.callback.onResolved){
                self.callback.onResolved(data);
            }
        }
        //reject 函数
        function reject(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'rejected';// 
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
            //执行回调
            if(self.callback.onResolved){
                self.callback.onResolved(data);
            }
        }
        try{
            //同步调用『执行器函数』
            executor(resolve, reject);
        }catch(e){
            //修改 promise 对象状态为『失败』
            reject(e);
        }
    }
    
    //添加 then 方法
    Promise.prototype.then = function(onResolved, onRejected){
        //调用回调函数  PromiseState
        if(this.PromiseState === 'fulfilled'){
            onResolved(this.PromiseResult);
        }
        if(this.PromiseState === 'rejected'){
            onRejected(this.PromiseResult);
        }
        //判断 pending 状态
        if(this.PromiseState === 'pending'){
            //保存回调函数
            this.callback = {
                onResolved: onResolved,
                onRejected: onRejected
            }
        }
    }






    8-指定多个回调:

    index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Promise-封装 | 8 - 指定多个回调 </title>
        <script src="./promise.js"></script>
    </head>
    <body>
        <script>
            //实例化对象
            let p = new Promise((resolve, reject) => {
                setTimeout(() => {
                    // resolve('OK');
                    reject('No');
                }, 1000);
            });
    
            p.then(value => {
                console.log(value);
            }, reason=>{
                console.warn(reason);
            });
    
            p.then(value => {
                alert(value);
            }, reason=>{
                alert(reason);
            });
    
            console.log(p);
    
    
        </script>
    </body>
    </html>

    promise.js:

    //声明构造函数
    function Promise(executor){
        //添加属性
        this.PromiseState = 'pending';
        this.PromiseResult = null;
        //声明属性
        this.callbacks = [];
        //保存实例对象的 this 的值
        const self = this;// self _this that
        //resolve 函数
        function resolve(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'fulfilled';// resolved
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
            //调用成功的回调函数
            self.callbacks.forEach(item => {
                item.onResolved(data);
            });
        }
        //reject 函数
        function reject(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'rejected';// 
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
            //执行失败的回调
            self.callbacks.forEach(item => {
                item.onRejected(data);
            });
        }
        try{
            //同步调用『执行器函数』
            executor(resolve, reject);
        }catch(e){
            //修改 promise 对象状态为『失败』
            reject(e);
        }
    }
    
    //添加 then 方法
    Promise.prototype.then = function(onResolved, onRejected){
        //调用回调函数  PromiseState
        if(this.PromiseState === 'fulfilled'){
            onResolved(this.PromiseResult);
        }
        if(this.PromiseState === 'rejected'){
            onRejected(this.PromiseResult);
        }
        //判断 pending 状态
        if(this.PromiseState === 'pending'){
            //保存回调函数
            this.callbacks.push({
                onResolved: onResolved,
                onRejected: onRejected
            });
        }
    }






    异步修改状态then方法返回结果


    index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Promise-封装 | 10 - 异步任务 then 返回结果</title>
        <script src="./promise.js"></script>
    </head>
    <body>
        <script>
            //实例化对象
            let p = new Promise((resolve, reject) => {
                setTimeout(() => {
                    // resolve('OK');
                    reject("Error");
                }, 1000)
            });
    
            //执行 then 方法
            const res = p.then(value => {
                // return 'oh Yeah';
                throw 'error';
            }, reason=>{
                // console.warn(reason);
                throw 'error';
            });
    
            console.log(res);
        </script>
    </body>
    </html>

    promise.js:

    //声明构造函数
    function Promise(executor){
        //添加属性
        this.PromiseState = 'pending';
        this.PromiseResult = null;
        //声明属性
        this.callbacks = [];
        //保存实例对象的 this 的值
        const self = this;// self _this that
        //resolve 函数
        function resolve(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'fulfilled';// resolved
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
            //调用成功的回调函数
            self.callbacks.forEach(item => {
                item.onResolved(data);
            });
        }
        //reject 函数
        function reject(data){
            //判断状态
            if(self.PromiseState !== 'pending') return;
            //1. 修改对象的状态 (promiseState)
            self.PromiseState = 'rejected';// 
            //2. 设置对象结果值 (promiseResult)
            self.PromiseResult = data;
            //执行失败的回调
            self.callbacks.forEach(item => {
                item.onRejected(data);
            });
        }
        try{
            //同步调用『执行器函数』
            executor(resolve, reject);
        }catch(e){
            //修改 promise 对象状态为『失败』
            reject(e);
        }
    }
    
    //添加 then 方法
    Promise.prototype.then = function(onResolved, onRejected){
        const self = this;
        return new Promise((resolve, reject) => {
            //调用回调函数  PromiseState
            if(this.PromiseState === 'fulfilled'){
                try{
                    //获取回调函数的执行结果
                    let result = onResolved(this.PromiseResult);
                    //判断
                    if(result instanceof Promise){
                        //如果是 Promise 类型的对象
                        result.then(v => {
                            resolve(v);
                        }, r=>{
                            reject(r);
                        })
                    }else{
                        //结果的对象状态为『成功』
                        resolve(result);
                    }
                }catch(e){
                    reject(e);
                }
            }
            if(this.PromiseState === 'rejected'){
                onRejected(this.PromiseResult);
            }
            //判断 pending 状态
            if(this.PromiseState === 'pending'){
                //保存回调函数
                this.callbacks.push({
                    onResolved: function(){
                        try{
                            //执行成功回调函数
                            let result = onResolved(self.PromiseResult);
                            //判断
                            if(result instanceof Promise){
                                result.then(v => {
                                    resolve(v);
                                }, r=>{
                                    reject(r);
                                })
                            }else{
                                resolve(result);
                            }
                        }catch(e){
                            reject(e);
                        }
                    },
                    onRejected: function(){
                        try{
                            //执行成功回调函数
                            let result = onRejected(self.PromiseResult);
                            //判断
                            if(result instanceof Promise){
                                result.then(v => {
                                    resolve(v);
                                }, r=>{
                                    reject(r);
                                })
                            }else{
                                resolve(result);
                            }
                        }catch(e){
                            reject(e);
                        }
                    }
                });
            }
        })
    }






  • 相关阅读:
    配置类Configuration怎样使用
    MVC三和,你能辨别它?
    杭州电 1372 Knight Moves(全站搜索模板称号)
    Verilog之i2c合约
    android requestDisallowInterceptTouchEvent用途
    其简单的通用适配器的定义
    开发专题指南: JEECG高速微云开发平台前言
    (1)QlikView概要
    HDU2841 Visible Trees (容斥原理)
    每天进步一点点——Linux系统时间来处理
  • 原文地址:https://www.cnblogs.com/juham/p/14906494.html
Copyright © 2011-2022 走看看