一、promise含义
promise是一套专门处理异步场景的规范,它能有效的避免回调地狱的产生,使异步代码更加清晰,简洁,统一。
二、 promise的规定
- 所有的异步场景,都可以看做是一个异步任务,每个异步任务,在JS中应表现为一个对象,该对象称之为promise对象,也叫作做任务对象。如:发送表白信息,远程登录,延时弹窗。
- 每个任务对象,都有两个阶段,三个状态。
- 挂起=>完成,称为resolve;挂起=>失败,称为reject。任务完成时,可能有一个相关数据;任务失败时,可能有一个失败原因。
- 可以针对任务进行后续处理,针对完成状态的后续处理称之为onFulfilled,针对失败的后续处理称之为onRejected。
三、promise API
- 含义:ES6提供一套API,实现了promise规范。
- catch方法:.catch(onRejected)=.then(null,onRejected)
- 使用(见下面例题)
//在一秒钟之后输出finish
function delay(time){
return new Promise(resolve,reject)=>{
setTimeout(()=>{
resolve();
},time)
}
}
delay(1000).then(()=>{
console.log(finish);
})
四、Promise的链式调用
- then方法必定会返回一个新的Promise,可理解为,后续处理一个新任务。
- 新任务的状态取决于后续处理:
- 若没有相关后续处理,新任务的状态和前任务一致,数据为前任务的数据。
//pro1是完成状态,pro1的后续处理是针对失败进行处理,则pro2的状态和pro1一致(fulfilled),数据为1
const pro1=new Promise((resolve,rejcted)={
console.log('学习');
resolve(1);
})
const pro2=pro1.catch(()=>{
console.log('失败!');
});
- 若有相关的后续处理但还未执行,新任务挂起。
//pro1有相关后续处理,但是在五秒以内都处于未执行状态,所以pro2的状态挂起,此时的pro1的状态也是挂起。
const pro1=new Promise((resolve,reject)={
setTimeout(()=>{
resolve();
},5000)
});
const pro2=pro1.then(()=>{
console.log('考试');
});
- 若后续处理执行了,则根据后续处理的情况确定新任务的状态。
1.后续处理执行无错,状态完成,数据为手续处理的返回值。
const pro1=new Promise((resolve,reject)={
console.log('学习');
resolve();
});
//有相关后续处理,且无错,完成状态,数据为1.
const pro2=pro1.then(()=>{
console.log('考试');
return 1;
});
2.后续处理执行无错,状态失败,数据为异常对象。
const pro1=new Promise((resolve,rejct)={
console.log('学习');
resolve();
});
//有相关后续处理,抛出错误,失败状态,数据为Error(2).
const pro2=pro1.then(()=>{
thow new Error(2);
});
3.后续处理执行无错,返回的是一个任务对象,新任务的状态和数据与该任务对象一致。
const pro1=new Promise((resolve,rejct)={
resolve();
});
//有相关后续处理,后续处理返回一个任务对象,则pro2的状态和数据与该返回的任务对象一致,Pro2为失败状态,数据为undefined.
const pro2=pro1.then(()=>{
return new Promise((resolve,reject)=>{
reject();
})
});
五、Promise的静态方法
六、async和await
- 消除回调 : 有了Promise,异步任务就有了一种统一的处理方式。有了一种统一的处理方式,ES官方就可以对其进行进一步优化。虽然Promise消除了回调函数,但没有消除回调(pro.then().then()),因此在ES7中提出了async和await,用于更加优雅的表示Promise。
- async : 用于修饰函数,被它修的函数,一定返回Promise。
async function hello(){
// 该函数返回值是Promise完成后的数据
//相当于 return new Promise.resolve(1);
return 1;
}
hello();
//返回Promise{1}
async function hello2(){
trow new Error(1);//若执行过程中报错,则该任务是rejected
}
hello();
//返回Promise{<rejected> Error(1)}
- await : 表示等某个Promise的完成,它必须用于async函数中。
async function hello(){
const n=await Promise.resolve(1);
console.log(n);//1
}
//等同于
function hello(){
return new Promise((resolve,reject)=>{
Promise.resolve(1).then(n=>{
console.log(1);
resolve(1);
})
})
}