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