zoukankan      html  css  js  c++  java
  • 手写promise实现自定义封装多个回调函数的执行

    自定义封装多个回调函数的执行

    <script src="./Promise.js"></script>
     let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('ok');
            }, 1000)
        })
    p.then(res => {
        alert(res)
    }, err => {
        console.log(err)
    })
    p.then(res => {
        console.log(res)
    }, err => {
        console.log(err)
    })
    
    
    从上面这一段代码中,我们发现
    只出现了console.log()
    并没有出现alert()
    因为我们出现了覆盖
    第二个将第一个覆盖了;
    所以我们使用
    // 这个是保存回调函数
    this.callBack={
        onResolve:onResolve,
        onReject:onReject
    }
    这样的保存回调函数是不合适的
    我们应该将所有的回调函数保存起来
    1==> 将之前声明的对象对象变成一个数组
    // 声明属性成为一个数组
    this.callBack=[];
    
    2==> 保存回调的时候每一个都进行保存使用push方法
    // 这个是保存回调函数
    this.callBack.push(
        {
            onResolve:onResolve,
            onReject:onReject
        }
    )
    
    3==>将成功或者失败后的回调函数进行遍历
    // 调用成功的回调函数进行遍历
    self.callBack.forEach(item=>{
        item.onResolve(data)
    })
    
    // 调用失败的回调函数数进行遍历
    self.callBack.forEach(item=>{
        item.onReject(err)
    })
    

    实现自定义封装多个回调函数的执行

    function Promise(executor){
        const self=this;
        function resolve(data){
            // 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);
            if( self.PromiseStatus!=='pending') return
            self.PromiseStatus='resolved';
            self.PromiseValue=data;
    
            // 调用成功的回调函数进行遍历
            self.callBack.forEach(item=>{
                item.onResolve(data)
            })
        }
        // 同样声明成为一个函数;修改状态
        function reject(err){
            // 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);
            if( self.PromiseStatus!=='pending') return
            self.PromiseStatus='rejected';
            self.PromiseValue=err; 
            // 调用失败的回调函数数进行遍历
           self.callBack.forEach(item=>{
               item.onReject(err)
           })
        }
        this.PromiseStatus ='pending' ;
        this.PromiseValue =null;
        // 声明属性 new  add
        this.callBack=[];
        // 对异常进行处理;使用try catch
        try{
            executor(resolve,reject);
        }catch(err){
            reject(err);
        }
    }
    // 自定义封装then方法执行回调
    Promise.prototype.then=function(onResolve,onReject){
        //{PromiseStatus:"resolved"PromiseValue:"ok"}
        if(this.PromiseStatus==='resolved'){
            onResolve(this.PromiseValue)
        }
        if(this.PromiseStatus==='rejected'){
            onReject(this.PromiseValue)
        }
        // 如果是pending的状态
        if(this.PromiseStatus==='pending'){
            // 这个是保存回调函数
            this.callBack.push(
                {
                    onResolve:onResolve,
                    onReject:onReject
                }
            ) 
        }
    }
    
    作者:明月人倚楼
    出处:https://www.cnblogs.com/IwishIcould/

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!

    万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    支付宝
    微信
    本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    hdoj2187:悼念512汶川大地震遇难同胞 (贪心)
    2.0其它之Transform详解,以及UIElement和FrameworkElement的常用属性
    2.0外观之样式, 模板, 视觉状态和视觉状态管理器
    2.0图形之Ellipse, Line, Path, Polygon, Polyline, Rectangle
    2.0控件之ListBox, MediaElement, MultiScaleImage, PasswordBox, ProgressBar, RadioButton
    2.0画笔之SolidColorBrush, ImageBrush, VideoBrush, LinearGradientBrush, RadialGradientBrush
    2.0图形之基类System.Windows.Shapes.Shape
    2.0交互之鼠标事件和键盘事件
    2.0控件之ScrollViewer, Slider, StackPanel, TabControl, TextBlock, TextBox, ToggleButton
    2.0交互之InkPresenter(涂鸦板)
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/14729147.html
Copyright © 2011-2022 走看看