一、为什么有Promise?
Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理更强大。Promise 将嵌套格式的代码变成了顺序格式的代码。
二、Promise的语法
- Promise是JavaScript里的一个内置对象,es6规定,Promise对象是一个构造函数,用new Promise()来生成promise实例
- Promise构造函数接收一个函数作为参数,该函数又接收两个参数resolve和reject
- resolve和reject都是函数,也是Promise构造函数上的方法,调用resolve()表示将promise设置为成功状态,调用reject()设置为失败状态,resolve和reject的参数都是字符串,表示成功或失败的信息,可以自己定义
实例:
//创建promise对象:
let p = new Promise(function(resolve,reject){
//resolve("成功") // 设置为成功
reject("失败") //设置为失败
});
console.log(p); // p输出是一个promise对象
三、promise的三种状态
- pending 进行中
- fulfilled 成功
- rejected 失败
从pending转换为成功或失败状态是不可逆的
四、Promise的方法
- Promise原型对象上的方法then、catch、finally;
成功调用then,失败调用catch,失败或成功都会调用finally()
let pA = Promise.resolve('A成功');
let pB = Promise.reject('B失败');
pA
.then(res=>{console.log(res);})
.catch(res=>console.log(res))
.finally(()=>{console.log("A成功了吗?");});
pB
.then(res=>{console.log(res);})
.catch(res=>console.log(res))
.finally(()=>{console.log("B成功了吗?");});
//输出:
//A成功
//B失败
//A成功了吗?
//B成功了吗?
- Promise的静态方法resolve、reject、all、race
静态方法就是Promise构造函数上的方法,可以直接用“Promise.”调用,如:
let p1 = new Promise((resolve,reject)=> resolve("成功"));
let p2 = Promise.resolve("成功");
console.log(p1,p2);
// p2和p1输出结果是一样的
all和race:
参数都是数组
all()等待所有任务执行完毕执行
race()哪个任务先执行完就返回哪个任务的结果,后面的任务不再监测
// 创建两个异步任务p3、p4
function createTask(time){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log(time);
resolve(`执行完毕用了${time/1000}秒`);
},time)
})
}
let p3 = createTask(1000); // p3需要1秒执行
let p4 = createTask(4000); // p3需要4秒执行
Promise.all([p3,p4]).then(res=>console.log(res)).catch(res=>console.log(res))
// 4s后输出 ['执行完毕用了1秒', '执行完毕用了4秒']
Promise.race([p3,p4]).then(res=>console.log(res)).catch(res=>console.log(res)
// 1s后输出 执行完毕用了1秒