Promise.resolve = function (value) {
//返回一个Promise
return new Promise((resolve, reject) => {
//如果value是Promise,value的结果就是return promise的结果
if(value instanceof Promise){
value.then(resolve, reject)
} else{
//直接返回成功
reject(value)
}
})
}
Promise.reject = function (reason) {
//返回一个失败的Promise
return new Promise((resolve, reject) => {
reject(reason)
})
}
Promise.all = function (promises) {
//保存所有已成功的promise的结果,最大长度已确定
const resolvedValues = new Array(promises.length)
//计数,已成功的promise的个数
let resolvedCount = 0
//返回一个promise
return new Promise((resolve, reject) => {
//遍历promises,成功了就记录下来,有一个失败就返回失败
promises.forEach((item, index) => {
//用上前面定义的resolve方法
Promise.resolve(item).then(
value => {
//数量+1
resolvedCount ++
//保存成功的结果,不能用push,要保证结果顺序和Promises的元素顺序一致
resolvedValues[index] = value
//当成功数量和promises的长度一致时,全部成功
if(resolvedCount === promises.length){
resolve(resolvedValues)
}
},
reason => {
//有一个失败就返回失败promise
reject(reason)
}
)
})
})
}
Promise.race = function (promises) {
return new Promise((resolve, reject) => {
promises.forEach((item, index) => {
Promise.resolve(item).then(
//由第一个完成的promise的结果决定return的promise的结果
value => {
resolve(value)
},
reason => {
reject(reason)
}
)
})
})
}
代码已同步更新到github
https://github.com/hnt815/promise
Promise系列文章
Promise从两眼发懵到双眼放光(1)-准备篇
Promise从两眼发懵到双眼放光(2)-Promise基础
Promise从两眼发懵到双眼放光(3)-Promise的几个关键问题(一)
Promise从两眼发懵到双眼放光(4)-Promise的几个关键问题(二)
Promise从两眼发懵到双眼放光(5)-手写Promise之整体结构
Promise从两眼发懵到双眼放光(6)-手写Promise之构造函数
Promise从两眼发懵到双眼放光(7)-手写Promise之then方法和catch方法
Promise从两眼发懵到双眼放光(8)-手写Promise之resolve,reject,all,race方法
Promise从两眼发懵到双眼放光(9)-async和await
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。