resolve函数封装
1.resolve是Promise函数上的方法,不是Promise实例对象的方法
2.resolve返回的结果为一个Promise对象
3.判断Promise对象下的状态:是Promise,状态由该Promise决定,是Promise,就调用then方法,成功走第一个回调,失败走第二个回调;undefined或者值,状态为成功,调用resolve就可以
//添加resolve方法
Promise.resolve = function (value) {
// 返回结果为Promise对象
return new Promise((resolve, reject) => {
// 判断Promise对象下是否为Promise
if (value instanceof Promise) {
console.log(value)
value.then(v => {
console.log(v)
resolve(v);
}, r => {
console.log(r)
reject(r);
})
} else {
// 状态设置为成功
resolve(value);
}
})
}
reject函数封装
Promise.reject返回的所有的都是失败的onRjected
//添加reject方法
Promise.reject = function (reason){
return new Promise((resolve,reject)=>{
reject(reason);
})
}
all方法封装
1.返回结果为Promise对象
2.参数是Promise组成的数组
3.结果由参数的成功决定,参数的状态都为成功才成功。成功结果是参数的Promise成功的组合
参数有一个失败就是失败的了,失败结果是失败的那个Promise
//添加all方法
Promise.all = function (promises) {
let count = 0;
//存放成功的数组
let arr = [];//这种方式的弊端是顺序会不正确
// 返回结果为一个Promise 对象
return new Promise((resolve, reject) => {
// 遍历参数的数组
for (let i = 0; i < promises.length; i++) {
promises[i].then(v => {
// 可以得知对象状态是成的 每个参数的Promise都为成功就是成功 加计数变量
count++;
//当前promise对象成功的结果 存入到数组中
// arr.push(v)
arr[i] = v;
if (count === promises.length) {
resolve(arr[i])
}
}, r => {
reject(r);
})
}
})
}
race方法
1.返回结果为Promise对象
2.参数是Promise组成的数组
3.状态由最先改变状态的peomise决定
//添加race方法
Promise.race=function (promises) {
return new Promise((resolve,reject)=>{
for(let i=0;i<promises.length;i++){
promises[i].then(v=>{
resolve(v)
},r=>{
reject(r)
})
}
})
}
then方法中是异步执行的