原生JS实现Promise

Posted 古兰精

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原生JS实现Promise相关的知识,希望对你有一定的参考价值。

  ES6中Promise可以说很大情况下改善了异步回调的嵌套问题,那么如果我们自己去写一个类似Promise的库应该怎么去写?

  我们先看一下Promise的特点:

  第一:Promise构造函数接受一个函数作为参数,函数里面有两个参数resolve和reject分别作为执行成功或者执行失败的函数

var promise=new Promsie(function(resolve,rejec){
    if(/*异步执行成功*/){
        resolve(value);
    }else{
        reject(error);
    }
})

  第二:可以通过then设置操作成功之后的操作,接受两个函数作为参数

.then(function(){
    //回调执行成功之后的操作
},function(){
    //回调执行失败之后的操作,可以没有
});

  那么原生js实现以上特点应该比较简单了

function PromiseM(){
    this.status=pending;
    this.msg=‘‘;
    var process=arguments[0];
    var that=this;
    process(function(){
        that.status=resolve;
        that.msg=arguments[0];
    },function(){
        that.status=reject;     
        that.msg=arguments[0];           
    });
    return this;
}
PromiseM.prototype.then=function(){
    if(this.status==resolve){
        arguments[0](this.msg);
    }
    if(this.status==reject&&arguments[1]){
        arguments[1](this.msg);
    }
}
//测试用例
var mm=new PromiseM(function(resolve,reject){
    resolve(‘123‘);//123其实就是第二个arguments[0]
});//上面的第一个arguments[0]
mm.then(function(success){
    console.log(success);//该success其实就是上面的this.msg
    console.log("ok!");
},function(){
    console.log(fail!);
});
//123
//ok

  以上只是最基本的实现,在代码结构结构和容错方面没有进行考虑。

 



以上是关于原生JS实现Promise的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段12——JavaScript的Promise对象

js-Promise基础

如何实现 BluebirdJS 同步检查扩展原生 Promise

Javascript中的Promise

原生js写ajax结合promise对象