function Promise(exector) {
var _this = this
this.status = 'pending'
this.value = undefined
this.resolveList = []
this.rejectList = []
try {
exector(resolve, reject)
}catch(e) {
reject(e)
}
function resolve(value) {
if(_this.status === 'pending') {
_this.status = 'fulfilled'
_this.value = value
_this.resolveList.forEach(item=> {
item(_this.value)
_this.resolveList.shift()
})
}
}
function reject(value) {
if(_this.status === 'pending') {
_this.status = 'rejected'
_this.value = value
_this.rejectList.forEach(item=> {
item(_this.value)
_this.rejectList.shift()
})
}
}
}
Promise.prototype.then = function(resolveCallback, rejectCallback) {
var _this = this
if(this.status === 'fulfilled') {
return new Promise((resolve, reject)=> {
var result = resolveCallback(_this.value)
if(result instanceof Promise) {
result.then(resolve, reject)
}else {
resolve(result)
}
})
}
if(this.status === 'rejected') {
return new Promise((resolve, reject)=> {
var result = rejectCallback(_this.value)
if(result instanceof Promise) {
result.then(resolve, reject)
}else {
reject(result)
}
})
}
if(this.status === 'pending') {
return new Promise((resolve, reject)=> {
_this.resolveList.push(function() {
var result = resolveCallback(_this.value)
if(result instanceof Promise) {
result.then(resolve, reject)
}else {
resolve(result)
}
})
_this.rejectList.push(function() {
var result = rejectCallback(_this.value)
if(result instanceof Promise) {
result.then(resolve, reject)
}else {
reject(result)
}
})
})
}
}
new Promise((resolve, reject)=> {
resolve(666)
}).then((data)=> {
console.log('resolve1:' + data)
return 999
}).then((data)=> {
console.log('resolve2:' + data)
})
//resolve1: 666
//resolve2: 999
new Promise((resolve, reject)=> {
resolve(666)
}).then((data)=> {
console.log('resolve1:' + data)
return new Promise((resolve, reject)=> {
resolve(999)
})
}).then((data)=> {
console.log('resolve2:' + data)
})
//resolve1: 666
//resolve2: 999
Promise.all = function(iterable) {
return new Promise((resolve, reject) => {
let result = []
for(const item of iterable) {
item.then(data => {
result.push(data)
}, reason=> {
result = reason
return
})
}
resolve(result)
})
}
//下面是测试用例
let p1 = new Promise((resolve, reject) => {
resolve(666)
})
let p2 = new Promise((resolve, reject) => {
resolve(888)
})
let p3 = new Promise((resolve, reject) => {
resolve(999)
})
let p6 = new Promise((resolve, reject) => {
reject(222)
})
let p4 = Promise.all([p1, p2, p3])
p4.then(data => {
console.log(data)
})
//[666, 888, 999]
let p7 = Promise.all([p1, p3, p6])
p7.then(data => {
console.log(data)
})
//222
Promise.race = function(iterable) {
return new Promise((resolve, reject) => {
for(const item of iterable) {
item.then(data => {
resolve(data)
}, reason=> {
reject(reson)
})
}
})
}
//测试用例
var p1 = new Promise(function(resolve, reject) {
setTimeout(resolve, 500, 'one');
});
var p2 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'two');
});
Promise.race([p1, p2]).then(function(value) {
console.log(value);
// Both resolve, but promise2 is faster
});
//two
Promise.resolve = function(data) {
return new Promise((resolve, reject) => {
resolve(data)
})
}
//测试用例
var p1 = Promise.resolve(123);
p1.then(function(value) {
console.log(value);
});
//123
Promise.reject = function(data) {
return new Promise((resolve, reject) => {
reject(data)
})
}