• 初步了解 promise02 简单手写源码


    废话不多说··  直接上 简单手写 promise 源码   

    /**
     *@ 简单手写 prosmise 方法
     */
    
    const enum_pending = "pending";
    const enum_resolved = "resolved";
    const enum_rejected = "rejected";
    
    function Promise(executor) {
        let selt = this;
        //初始化状态
        selt.value = undefined;
        selt.reason = undefined;
        selt.status = enum_pending;
    
        //定义存放then成功的回调数组
        selt.onResolvedCallbacks = [];
        selt.onRejectedCallbacks = [];
    
        //成功执行
        function resolve(value) {
            //等待的状态(pending)才可以执行 并设置成功的状态
            if (selt.status === enum_pending) {
                selt.value = value;
                selt.status = enum_resolved;
                selt.onResolvedCallbacks.forEach(fn => fn());
            }
        }
    
        //失败执行
        function reject(reason) {
            //等待的状态(pending)才可以执行 并设置失败的状态
            if (selt.status===enum_pending){
                selt.reason= reason;
                selt.status=enum_rejected;
                selt.onRejectedCallbacks.forEach(fn=>fn());
            }
        }
        //异常就走失败
        try {
            executor(resolve,reject);
        }catch (e) {
            reject(e);
        }
    
    };
    //定义 promise then 方法
    Promise.prototype.then = function (onFulfilled, onRejected) {
        let self = this;
        //根据状态执行对应的方法
        if (self.status === enum_resolved) {
            onFulfilled(self.value);
        }
        if (self.status === enum_rejected) {
            onRejected(self.value);
        }
        if (self.status === enum_pending) {
            //保存回调函数
            self.onResolvedCallbacks.push(() => {
                onFulfilled(self.value);
            });
            self.onRejectedCallbacks.push(() => {
                onRejected(self.value);
            })
        }
    
    }
    
    module.exports = Promise;
    

      调用:

    let Promise = require("./01.promise");
    
    let promise = new Promise((resolve,reject)=>{
        resolve()
    })
    
    promise.then((data)=>{
        console.log("成功·");
    },(err)=>{
        console.log("失败·");
    });
    

      

  • 相关阅读:
    轮播图2
    点击按钮切换轮播图
    轮播图
    2016.5.5_十进制转二进制【ABAP】
    2016.4.26_longtext长文本【ABAP】
    2016.4.26_动态内表【ABAP】
    2016.4.26_下载abap代码【ABAP】
    2016.4.15_debug小技巧【ABAP】
    2016.4.1_js向controller传数据【笔记】
    2016.3.21_TABLE CONTROL【ABAP】
  • 原文地址:https://www.cnblogs.com/liujzcom/p/9490990.html
Copyright © 2020-2023  润新知