手写js实现Promise各种方法。
Promise.resolve()
(有时需要将现有对象转为 Promise 对象,Promise.resolve方法也会起到这个作用。)
1.传参为一个 Promise, 则直接返回它。
2.传参为一个 thenable 对象,返回的 Promise 会跟随这个对象,采用它的最终状态作为自己的状态。
3.其他情况,直接返回以该值为成功状态的promise对象。
Promise.all()
-
功能说明 如果参数中有一个Promise失败,那么Promise.all返回的promise对象失败。
-
参数说明 (1)如果传入的可迭代对象为空,Promise.all 会同步地返回一个已完成(resolved)状态的promise。
(2)传入的参数不一定是数组对象,可以是"遍历器"。
(3)在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组。 -
实现
// all实现
Promise.all = function (arr){
let n = 0; //声明一个计算器,全部执行成功后再resolve
let resolveValue = []; //存放结果的数组
let len = arr.length;
// 如果传入的参数是一个空的可迭代对象,直接进行resolve
if (len === 0){
resolve(resolveValue);
return;
}
return new Promise(function(resolve,reject){
for (let i=0;i<len;i++){
//如果执行成功后,将结果添加到数组中,并且n++
// 为什么不直接 promise[i].then, 因为promise[i]可能不是一个promise
Promise.resolve(arr[i]).then(res=>{
resolveValue.push(res);
n++;
//如果n为参数数组长度,证明全部执行成功,执行resolve()
if(n === len){
resolve(resolveValue);
}
})
.catch(err=>{
reject(err);
})
}
})
}
测试all方法
//测试all方法
let p1 = new Promise(function(resolve,reject){
let x =0;
setTimeout(function(){
x++;
if(x==1){
resolve(x);
}
},1000)
});
let p2 = new Promise(function(resolve,reject){
let x = 0;
setTimeout(function(){
x++;
if(x==1){
resolve(x);
}
},1000)
})
Promise.all([p1,p2]).then((res)=>{
console.log(res)
})
Promise.race
- 功能说明 Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。
- 参数说明 返回的是一个Promise值。
- 代码实现
// race实现
Promise.race = function(arr){
return new Promise((resolve,reject)=>{
let len = arr.length;
for (let i=0;i<len;i++){
Promise.resolve(arr[i]).then(res=>{
resolve(res);
}).catch(err=>{
reject(err);
})
}
})
}
async和await如何简化Promise
作用:
1.简化Promise对象的使用:不用再使用then()来指定成功/失败的回调函数
以同步编码(没有回调函数了)方式实现异步流程。