function MyPromise(callback) {
this.subs = [];
// 這裏的 resolve 和 reject 需要手動綁定 this ,
//要不然,resolve函數只是一個函數,
//綁定不到當前 MyPromise 的實例
callback(this.resolve.bind(this), this.reject.bind(this))
}
MyPromise.prototype.resolve = function (data) {
if (this.subs && this.subs.length) {
this.subs.shift()(data)
}else{
if(this.finalyFn){
this.finalyFn('resolved')
}
}
}
MyPromise.prototype.reject = function (data) {
this.subs = [];
if(this.finalyFn){
this.finalyFn('rejected')
}
}
MyPromise.prototype.then = function (fn) {
this.subs.push(fn);
// 這裏,需要 return this ,保證當前調用者仍是 當前的 MyPromise 實例
return this;
}
MyPromise.prototype.finaly = function (fn) {
this.finalyFn = fn
}
var a = new MyPromise(function (resolve, reject) {
setTimeout(function () {
console.log('resolve')
resolve(1)
}, 1250)
})
a.then(function (data) {
setTimeout(function () {
console.log(data)
a.resolve('then---1')
}, 2000)
}).then(function (data) {
setTimeout(function () {
console.log(data)
a.reject('reject')
}, 1000)
}).then(function (data) {
setTimeout(function () {
console.log(data)
}, 1000)
})