promise介绍
Promise是JavaScript中的一个对象,同时也是异步编程的一种解决方案,它的构造函数是同步执行的,then 方法是异步执行的。
promise作用
promise最直观的区别就是解决回调地狱的问题,.then()和.catch()方法将异步操作组织成更加清晰的结构。
Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)
pedding->初始状态:调用promise时,一开始就呈现出等待状态,遇到resolve或者reject之前,都处于这个状态,且可以改变,但如果确定了状态(fulfilled/reject),则结果将永远不变,不能再次修改
fulfilled->成功状态:在执行了resolve后,promise则会从pedding变成fulfilled,后续会进入.then 的回调函数中,在回调函数的第一个参数函数中可以获取到值
rejected->失败状态:在执行了reject后,promise状态会变成rejected,rejected函数传递的参数,可以在.then的第二个参数函数中获取的到,或者是在.catch获取到,但是如果程序上的错误,得通过.catch函数去拿到失败消息,在.then中是获取不了的
常见的写法
const p1 = new Promise((resolve, reject) => {
resolve("成功");
});
p1.then((res) => {
console.log("----打印:p1", res); //----打印:p1 成功
});
如果promise处于拒绝的状态可以直接在.then的失败回调中,获取reject的值(then里面的第二个参数);也可以在.catch中获取;如果两者同时出现代码中,看看是catch写在前面还是.then函数写在前面 常见业务中拒绝状态用.then去执行回调,程序异常用catch
const p1 = new Promise((resolve, reject) => {
reject("失败");
});
p1.then(
(res) => {
console.log("----打印:p1", res); //不执行
},
(rej) => {
console.log("----打印:p1", rej); //----打印:p1 失败
}
)
.catch(
(error)=>{
console.log("----打印:catch", error);//因为.then是放在.catch前面不会打印“失败”,如果程序异常,才会报异常信息
}
);
promise常用用法
Promise.then
doSomething().then(function(result) {
return doSomethingElse(result);
})
.then(function(newResult) {
return doThirdThing(newResult);
})
.then(function(finalResult) {
console.log('得到最终结果: ' + finalResult);
})
.catch(failureCallback);
Promise.catch
const p = new Promise((resolve, reject) => {
reject("拒绝");
console.log("----打印:"); //会输出
throw new Error("抛出错误"); //这一句改变promise状态,因为状态已经决定了
});
p.catch((error) => {
console.log(error); // :--拒绝
});
Promise.all
var p1 = new Promise((resoleve, reject) => {
setTimeout(() => {
resoleve("p1--3000");
}, 3000);
});
var p2 = new Promise((resoleve, reject) => {
setTimeout(() => {
resoleve("p2--1000");
}, 1000);
});
var p3 = new Promise((resoleve, reject) => {
setTimeout(() => {
console.log("----打印:看看是先执行失败,还是全部执行完再catch");
resoleve("p3--5000");
}, 5000);
});
var promiseArr = [p1, p2, p3];
console.time("promiseArr");
Promise.all(promiseArr)
.then((res) => {
console.log("res", res); //res [ 'p1--3000', 'p2--1000', 'p3--5000' ]
console.timeEnd("promiseArr"); // promiseArr: 5.020s
})
.catch((err) => console.log(err));