KuiSAhn

KuiSAhn 查看完整档案

郑州编辑  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

KuiSAhn 提出了问题 · 4月22日

我自己写了一个promise,但是实现后和ES6的的效果还有差别,麻烦各位帮我看一下是哪里出了问题吗?

照着网上的文章自己实现了一个Promise,这是代码
function myPromise(passedInFunction) {
    var self = this;
    this.pending = "pending"; // 初始状态
    this.fulfilled = "fulfilled"; // 完成态
    this.rejected = "rejected" // 失败态
    this.status = this.pending; // 初始化初始状态
    this.value = null; // 用于存储完成状态下需要传递的值
    this.error = null; // 用于存储失败状态下需要传递的值
    this.onFulfilledFnArr = []; // 存放完成态后方法的数组
    this.onRejectedFnArr = []; // 存放失败态后方法的数组

    function resolve(successValue) {
        if (self.status == self.pending) { // 如果不是初始状态的话就不能传递值和修改状态
            self.value = successValue; // 存储成功状态下的值
            self.status = self.fulfilled; // 修改状态为完成态
            self.onFulfilledFnArr.forEach(function (fulfilledFn) {
                fulfilledFn(self.value);
            })
        }
    }

    function reject(errorValue) {
        if (self.status == self.pending) {
            self.error = errorValue;
            self.status = self.rejected;
            self.onRejectedFnArr.forEach(function (rejectedFn) {
                rejectedFn(self.error);
            })
        }
    }

    passedInFunction(resolve, reject);
}

myPromise.prototype.then = function (successCallback, errorCallBack) {
    var self = this;

    successCallback = typeof (successCallback) == "function" ? successCallback : function (successValue) {};
    errorCallBack = typeof (errorCallBack) == "function" ? errorCallBack : function (errorInfo) {};

    if (self.status == self.fulfilled) { // 如果当前状态为完成态时
        return Promise2 = new myPromise(function (resolve, reject) { // 如果要链式操作的话这部是必须的
            setTimeout(function () { // 将successCallback放到下一次事件循环中
                try {
                    var p2Res = successCallback(self.value);// 取的successCallback的返回值
                    if (p2Res instanceof myPromise) {// 如果返回值也是一个myPromise的实例
                        p2Res.then(resolve, reject);// 那么就继续判断这个对象的状态并持续下去
                    }
                    resolve(p2Res.value);// 如果不是myPromise的实例的话就直接修改档当前状态,结束
                } catch (error) {
                    reject(error);
                }
            })
        })
    }
    
    if (self.status == self.rejected){
        return Promise2 = new myPromise(function(resolve,reject){
            setTimeout(function(){
                try {
                    var p2Res = errorCallBack(self.error);
                    if(p2Res instanceof myPromise){
                        p2Res.then(resolve,reject);
                    }
                } catch (error) {
                    reject(error);
                }
            })
        })
    }
    // 如果当前状态为pending时,我们就不知道到底是要执行successCallback还是errorCallBack,所以只能将这两个回调函数分别添加到上一个myPromise实例的对应回调函数数组里,供以后状态改变了之后调用
    if(self.status == self.pending){
        return Promise2 = new myPromise(function(resolve,reject){
            setTimeout(function(){
                self.onFulfilledFnArr.push(function(value){
                    try {
                        var p2Res = successCallback(self.value);
                        if (p2Res instanceof myPromise) {
                            p2Res.then(resolve, reject);
                        }
                        resolve(p2Res.value);
                    } catch (error) {
                        reject(error);
                    }
                })
                
                self.onRejectedFnArr.push(function(value){
                    try {
                        var p2Res = errorCallBack(self.error);
                        if(p2Res instanceof myPromise){
                            p2Res.then(resolve,reject);
                        }
                    } catch (error) {
                        reject(error);
                    }
                })
            })
        })
    }
}

写完后我自己用了一下:

var pro = new myPromise(function(resolve,reject){
            console.log(1);
            resolve(2);
        });
        
        // console.log(pro);

        pro.then(function(value){
            console.log(value);
            return new myPromise(function(resolve,reject){
                console.log(3);
                resolve(4);
            })
        }).then(function(value){
            console.log(value);
        })
        
        console.log(5);

但是最后执行结果却并没有像ES6Promise那样吧4打印出来。
image.png
大佬帮我看一下吧。

关注 1 回答 0

KuiSAhn 关注了用户 · 3月24日

李勇 @zhuoganliyong

90后码农一枚。关注互粉。
csdn:https://blog.csdn.net/zhuogan...
github:https://github.com/OkamiLee

关注 11

KuiSAhn 赞了回答 · 3月24日

解决echart地图如何只显示一个地名

`label: {

 normal: {
    show: true,
    position: 'right',
    formatter(v){
        return v.name==='成都'?'':v.name;
    },
}

}

    `
    

formatter可以返回函数 你想怎么显示都可以!

关注 3 回答 2

KuiSAhn 提出了问题 · 3月24日

解决echart地图如何只显示一个地名

echart地图,怎么样才能只显示一个地名
image.png
就是除成都外所有地名全部隐藏掉,但是点和线还得留着。百度了一下没有找到怎么解决

关注 3 回答 2

KuiSAhn 赞了回答 · 3月24日

解决拿到一个框架,但是框架里的代码是完全没有见过的样子

简单混淆,找解密网站即可

关注 5 回答 3

KuiSAhn 关注了用户 · 2019-10-29

viewweiwu @viewweiwu

咸鱼也是有梦想的!

关注 64

KuiSAhn 提出了问题 · 2019-07-25

解决拿到一个框架,但是框架里的代码是完全没有见过的样子

clipboard.png
代码如图所示,最近很困扰

关注 5 回答 3

KuiSAhn 提出了问题 · 2019-07-25

解决拿到一个框架,但是框架里的代码是完全没有见过的样子

clipboard.png
代码如图所示,最近很困扰

关注 5 回答 3

KuiSAhn 关注了专栏 · 2019-07-24

Rancher

Docker、Kubernetes与容器云相关技术干货,容器编排与调度、微服务架构、CI/CD、各类部署实战和代码级干货。

关注 1928

KuiSAhn 关注了专栏 · 2019-07-24

SegmentFault 之声

在这里,我们将为你推送 SegmentFault 思否公司官方合作信息,和合作伙伴最新动态。SegmentFault 思否是中国领先的开发者社区和技术媒体,中国最大的 Hackathon 组织者。我们致力于成为科技企业和开发者沟通的桥梁,帮助科技企业和开发者对话。

关注 10132

认证与成就

  • 获得 1 次点赞
  • 获得 4 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 4 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2019-07-24
个人主页被 88 人浏览