Promise是一个老生常谈的问题,在此就再次学习并以记录;
Promise的作用
Promise是异步编程,它的出现是用来解决回调地狱(callback),Promise对象用来封装一个异步操作并可以获取其结果;同时使我们的代码变得简单、易懂、易维护;使异步代码同步化;
Primse的三种状态
pending:进行中,初始状态resolved:已成功(又称 Fulfilled)rejected:已失败
Promise的方法
- 通过
console.dir(Promise)打印可以发现,Promise是一个构造函数; - 原型对象有
then、catch、finally等; - 实例对象有
reject、resolve、all、race等; .then有两个参数,第一个参数代表返回成功的回调,第二个参数代表返回失败,第二个参数类同于.catch.catch不但可以接收失败的回调,还可以接收代码运行错误,类似try catch 功能
Promise的使用
Promise的基本实现
Promise的基本实现 实现过程写的很详细,可直接参考
Promse.all()的实现
Promise.all方法接收一个promise数组,返回一个新promise;- 并发执行数组中的全部
promise; promise数组各项结果均为resolved,Promise.all会为resolved状态;promise数组有一项为rejected,则Promise.all会为rejected状态;Promise.all()其中一个reject后,其他的仍然还会执行;
const promiseAll = (arr) => {
return new Promise((resolve, reject) => {
let newArr = [];
arr.forEach(item => {
item
.then((res) => {
newArr.push(res);
// 当新数组和参数条数一样,代表执行结束
if (newArr.length === arr.length) {
resolve(newArr);
}
})
.catch((err) => {
reject(err);
});
});
});
};
promiseAll([Promise函数对象1, Promise对象2, Promise对象3])
.then((res) => {
console.log("模拟Promise.all().then===>", res);
})
.catch((rej) => {
console.log("模拟Promise.all().catch===>", rej);
});
Primse.race()的实现
Promise.race方法接收一个promise数组, 返回一个新promise;- 并发执行数组中的全部
promise; - 新的
Promise,是promise数组执行速度最快的那项的结果。
const promiseRace = (arr) => {
return new Promise((resolve, reject) => {
let newArr = [];
arr.forEach((item) => {
item
.then((res) => {
resolve(res);
})
.catch((err) => {
reject(err);
});
});
});
};
promiseAll([Promise函数对象1, Promise对象2, Promise对象3])
.then((res) => {
console.log("模拟Promise.race().then===>", res);
})
.catch((rej) => {
console.log("模拟Promise.rece().catch===>", rej);
});
Promise.resolve() 和 Promise.reject()的实现
Promise.resolve和Promise.reject的实现演示
Promise.resolve用来生成一个resolve完成态的promise;Promise.reject用来生成一个rejected失败态的promise。
// 实现Promise.resolve
const promiseRes = (value) => {
return new Promise((res, rej) => {
res(value);
});
};
// 实现Promise.reject
const promiseRej = (value) => {
return new Promise((res, rej) => {
rej(value);
});
};
promiseRes("resolve")
.then((res) => {
console.log(`模拟Promise.resolve().then===>`, res);
})
.catch((rej) => {
console.log(`模拟Promise.resolve().catch===>`, rej);
});
promiseRej("reject")
.then((res) => {
console.log(`模拟Promise.reject().then===>`, res);
})
.catch((rej) => {
console.log(`模拟Promise.reject().catch===>`, rej);
});
参考博客: juejin.cn/post/684490…
综上是对Promise的再次学习,若有问题,欢迎指正。