1.Promise有三个状态 pending待决议 fulfilled成功 rejected失败,一旦改变不能再修改
2.Promise构造函数接受一个函数,参数分别未resolve、reject两个函数,用
于修改状态
3.有一个then方法,接受两个回调,状态变化时调用相应的函数,并返回新的
promise对象
4.有一个catch方法,接收一个失败回调
const PENDING="pending"
const FULFILLED="fulfilled"
const REJECTED="rejected"
function _isFunction(fn){
return typeof fn ==='function'
}
class Promise{
constructor(fn) {
this.state=PENDING
this.success=undefined
this.fail=undefined
this.resolve_arg=undefined
this.reject_arg=undefined
this.nextState=PENDING
this.next_resolve_arg=undefined
this.next_reject_arg=undefined
this.nextResolve=undefined
this.nextReject=undefined
fn(this.resolve.bind(this),this.reject.bind(this))
}
resolve(arg){
this.resolve_arg=arg
this.state=FULFILLED
if (this.success){
this.next_resolve_arg=this.success(arg)
if (this.nextResolve){
this.nextResolve()
}
}
}
reject(arg){
this.reject_arg=arg
this.state=REJECTED
if (this.fail){
this.next_reject_arg=this.fail(arg)
}else {
if (this.nextReject){
this.nextReject(this.next_reject_arg)
}
}
}
then(success,fail){
if (this.state===FULFILLED){
this.next_resolve_arg=success(this.resolve_arg)
this.nextState=FULFILLED
}else if (this.state===REJECTED){
this.next_reject_arg=fail(this.reject_arg)
this.nextState=REJECTED
}else {
this.success=success
this.fail=fail
}
let $this=this
return new Promise(function (n_resolve,n_reject){
if ($this.nextState===FULFILLED){
n_resolve($this.next_resolve_arg)
}else if ($this.nextState===REJECTED){
n_reject($this.next_reject_arg)
}else {
$this.nextResolve=n_resolve
$this.nextReject=n_reject
}
})
}
catch(fail){
if (this.state===REJECTED){
fail(this.reject_arg)
}else {
this.fail=fail
}
}
}
module.exports=Promise