期约Promise
Promise的定义
? Promise对象用于作为异步任务结果的占位符,它代表了一个异步操作最终完成或者失败。它能把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。
//调用Promise构造函数,创建DelayedPromise对象
const DelayedPromise = new Promise((resolve, reject) => {
console.log("DelayedPromise executor");
//延时500ms兑现承诺
setTimeout(() => {
console.log("Resolving DelayedPromise");
resolve("DelayedPromise")
}, 500);
});
if(DelayedPromise !== null)
console.log("DelayedPromise is created");
//注册DelayedPromise处理函数
DelayedPromise.then( success => { //定义成功处理函数,success代表成功返回值
console.log("Resolve handled with " + success);
}, err => { //定义失败处理函数,err代表失败原因
console.log(err);
});
//执行结果
//DelayedPromise executor
//DelayedPromise is created
//Resolving DelayedPromise
//Resolve handled with DelayedPromise
? 调用Promise构造函数并传入执行函数( executor ),此时执行函数会立即被调用,最后再返回DelayedPromise对象。创建完DelayedPromise对象后,调用Promise对象的then方法注册用于处理执行函数结果的回调函数。当执行函数调用resolve时,执行作为传入then方法第一个参数的回调函数;若执行函数捕获到未处理的异常或调用了reject方法,则执行第二个回调函数。
Promise的生命周期
?
? 从是否异步是否完成的角度上看,在Promise对象的整个生命周期中,它会经历两种状态——未完成状态和已完成状态。在调用构造函数创建完一个Promise对象后,promise会进入第一个状态——等待(Pending)状态,此时异步任务处于未完成状态,无法得知最终会得到什么结果。
? 然后调用promise对象的then方法,用于注册一个处理异步操作结果的回调函数。当异步任务调用resolve函数后,promise将进入完成(Fulfilled)状态,此时会调用处理函数中的第一个回调函数并向该函数传递成功返回值;若异步任务调用reject函数或捕获到未被处理的异常时,promise将进入拒绝(Rejected)状态,此时会调用处理函数中的第二个回调函数并向该函数传递失败原因。
? 一旦异步任务进入到已完成状态时,promise的状态不能再被切换(即完成态和拒绝态不能相互切换)。
Promise执行顺序
console.log("At code end");//标记程序开始
//调用Promise构造函数,创建DelayedPromise对象
const DelayedPromise = new Promise((resolve, reject) => {
console.log("DelayedPromise executor");
//延时500ms兑现承诺
setTimeout(() => {
console.log("Resolving DelayedPromise");
resolve("DelayedPromise")
}, 500);
});
if(DelayedPromise !== null)
console.log("DelayedPromise is created");
//注册DelayedPromise处理函数
DelayedPromise.then( success => { //定义成功处理函数,success代表成功返回值
console.log("resolve handled with " + success);
}, err => { //定义失败处理函数,err代表失败原因
console.log(err);
});
//调用Promise构造函数,创建ImmediatePromise对象
const ImmediatePromise = new Promise((resolve, reject) => {
console.log("ImmediatePromise executor");
console.log("Resolving ImmediatePromise");
resolve("ImmediatePromise"); //立即兑现承诺
});
if(ImmediatePromise !== null)
console.log("ImmediatePromise is created");
//注册ImmediatePromise处理函数
ImmediatePromise.then( success => {
console.log("resolve handled with " + success);
}, err => {
console.log(err);
})
console.log("At code end");//标记程序结尾
//运行结果
//At code start
//DelayedPromise executor
//DelayedPromise is created
//ImmediatePromise executor
//Resolving ImmediatePromise
//ImmediatePromise is created
//At code end
//resolve handled with ImmediatePromise
//Resolving DelayedPromise
//resolve handled with DelayedPromise
? JavaScript在本次时间循环中的所有代码都执行完毕后(同步执行),再调用then回调函数用于处理promise(异步执行)。由代码的运行结果可知,“resolve handled with ImmediatePromise”与“resolve handled with DelayedPromise”跟setTimeout的回调函数都是在"At code end"之后才执行的,也就是说then方法创建的回调函数都是异步执行的。