promise/A+规范:
术语:
1、promise是一个对象或者函数,该对象或者函数有一个then方法
2、thenable是一个函数或者对象,用来定义then方法
3、value是promise成功时的状态值
4、reason是promise失败时的状态值
要求:一、二
一、
1、三种状态 :pending | fulfilled(resolved) | rejected
2、rejected当处于pending状态的时候,可以转移到fulfilled(resolved)或者rejected状态
3、当处于fulfilled(resolved)状态或者rejected状态的时候,就不可变。
二、
1、一个promise必须有一个then方法,then方法接受两个参数并且必须返回一个promise
// onFulfilled 用来接收promise成功的值 // onRejected 用来接收promise失败的原因 promise1=promise.then(onFulfilled, onRejected);
三、
简单的写一下promise的基本用法:
var promise = new Promise((resolve,reject)=>{ let a =1;b=2 if(a<b){ resolve(a) } else{ reject(b) } }) promise.then(function(value){ console.log(value) },function(error){ console.log(error) })
接着来实现promise的过程,不多说直接贴代码
function myPromise(constructor){ let self=this; self.status="pending" //定义状态改变前的初始状态 self.value=undefined;//定义状态为resolved的时候的状态 self.reason=undefined;//定义状态为rejected的时候的状态 function resolve(value){ //两个==="pending",保证了状态的改变是不可逆的 if(self.status==="pending"){ self.value=value; self.status="resolved"; } } function reject(reason){ //两个==="pending",保证了状态的改变是不可逆的 if(self.status==="pending"){ self.reason=reason; self.status="rejected"; } } //捕获构造异常 try{ constructor(resolve,reject); }catch(e){ reject(e); } }
同时,需要在myPromise
的原型上定义链式调用的then
方法:
myPromise.prototype.then=function(onFullfilled,onRejected){ let self=this; switch(self.status){ case "resolved": onFullfilled(self.value); break; case "rejected": onRejected(self.reason); break; default: } }
那么我们来测试一下结果:
var p=new myPromise(function(resolve,reject){resolve(1)}); p.then(function(x){console.log(x)}) //输出1
今天就写个进阶版的promise 喜欢更高难度的可以参考链接让我们共同进步吧
引荐链接 :实现一个完美符合Promise/A+规范的Promise