原生JS模拟Promise实现详解

Posted

tags:

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

参考技术A 作为一名程序猿,经常遇到回调函数的情况,原生js的回调函数是一层一层的嵌套调用,而es6提供了一种新的写法,Promise,它可以把原本的嵌套回调函数实现成横向的调用,即链式调用。
下面看一个Promise的简单用法:

接着开始模拟:

首先,_Promise构造函数会接收一个函数resolver并执行,函数中又包含resolve和reject两个参数,然后,_Promise构造函数生成的实例有三种状态,分别是pending(初始值)、fullfilled(成功)和rejected(失败),且由pending变为成功或者失败后状态不可逆。

resolve和reject函数执行的时候会先判断状态,如果是pending则执行,且将状态变为fullfilled或者rejected,并将resolve/reject函数中参数传递给_result,以便then函数调用时使用。

因为有可能存在链式调用,所以执行then函数的返回值需要判断,如果isResolve或者isReject函数返回的是一个新的_Promise实例,则返回这个实例,否则返回当前实例

至此,Promise已经模拟完成~

原生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实现详解的主要内容,如果未能解决你的问题,请参考以下文章

js中的promise详解

js中的promise详解

原生js写ajax结合promise对象

原生JS模拟实现callapplybind

原生js+css实现重力模拟弹跳系统的登录页面

js原生模拟点击事件