//promise里面只有三个状态,且三个状态的转换形式有两种 //由pending转换为fulfilled,由pending转换为rejected //Promise的构造函数参数是一个函数,函数的参数分别为resolve和reject,两者也均为一个函数 //then中是实际要执行的函数,将传递进来的值传给resolve和reject对应的参数 const PENDING = 'PENDING' const FULFILLED = 'FULFILLED' const REJECTED = 'REJECTED' class YPromise { constructor(cb) { this.state = PENDING; this.value = null; //承诺完成的回调列表 this.fulfilledCbs = []; //承诺被拒绝的回调列表 this.rejectedCbs = []; let resolve = data => { setTimeout(() => { if (this.state !== PENDING) return; //更改状态 this.state = FULFILLED; this.value = data; this.fulfilledCbs.forEach(c => { this.value = c(this.value); }) }, 0); } let reject = reason => { setTimeout(() => { if (this.state !== PENDING) return; this.state = REJECTED; this.reason = reason; this.rejectedCbs.forEach(c => { this.reason = c(this.reason); }) }, 0); } cb(resolve, reject); }; then(onFulfilled, onRejected) { if (typeof onFulfilled === 'function') { this.fulfilledCbs.push(onFulfilled); } if (typeof onRejected === 'function') { this.rejectedCbs.push(onRejected); } return this;//返回整个构造函数可以继续调用then方法 } } let promise = new YPromise((resolve, reject) => { if (4 > 1) { resolve('hi'); } else { reject(4大于1') } }) fulfilledCbs = [data => data + 'world'] promise.then(data => { return data + ' world'; }).then(data => { return data + '!'; }).then(data => { console.log(data); })