Promise 异步对象的学习记录
// 定义一个Promise异步异步对象
const p1 = new Promise((resolve,reject)=>{
if(true){
// 调用resolve函数,改变异步对象的状态为成功,且返回一个成功的数据出去
resolve('我是成功状态!');
}else{
// 调用reject函数,改变异步对象的状态为失败,且返回一个失败的数据出去
// 注意,异步对象的状态只能被改变一次,返回的数据就是这个异步对象的值
reject('我是失败的状态!')
}
})
// 也可以用语法糖---来简化一个异步对象
const p2 = Promise.resolve(2); // 这个也一个异步对象,且状态为成功,值为2
const p3 = Promise.reject(3); // 这个也是一个异步对象,且状态为失败,值3
// 异步对象都可以通过实例对象的then() 方法来获取成功或者失败的数据
p1.then((value)=>{
// 第一个回调函数接收到的是成功状态的数据
console.log('我是成功状态的数据;'+value);
},(reason)=>{
// 第二个回调函数接收的是失败状态的数据
console.log('我是失败状态的数据;'+reason);
})
// 异步实例对象的catch()方法可以获取失败状态的数据
p3.catch((reason)=>{
console.log('我是失败状态的数据;'+reason);
})
// 1,promise对象的all() 方法,接收一个数组,数组元素为promise异步对象,
// 返回值也是一个异步对象,状态由数组里面的异步对象决定,
// 里面的异步对象都为成功状态,
// 返回的就是一个成功状态的数据,该数据是一个数组,里面存放的就是多个异步对象成功状态返回过来的值
// 里面的异步对象只要有一个为失败状态,
// 返回的就是一个失败状态的数据,该数据就是那个返回失败状态的异步对象的数据值
const pAll = Promise.all([p1,p2,p3])
// 调用异步实例对象的then方法,获取他的值
pAll.then(values=>{
console.log('我是多个异步对象成功状态的成功数据的集合;'+values);
},reason=>{
console.log('我是多个异步对象中失败状态的数据;'+reason);
})
//2,异步对象的race()方法,接收的也是一个数组,里面元素也是异步对象,获取的是运行结束最快的那个异步对象的结果
const pRace = Promise.race([p1,p2,p3])
pRace.then(value=>{
console.log('我是数组中运行最早结束的那个异步对象的成功状态的值;'+value);
},reason=>{
console.log('我是数组中运行最早结束的那个异步对象的失败状态的值;'+reason);
})
// js引擎是先执行同步代码,在去异步队列中执行异步代码
// 队列分为微队列和宏队列,先执行完微队列在去执行宏队列
// then()方法的返回的异步对象可以通过,return 返回成功的状态,改变成功的状态
// throw 抛出一个错误,将异步对象状态改为失败
/*
1,js中用来存储待执行回调函数的队列包含2个不同特定的列队
2,宏列队;用来保存待执行的宏任务(回调),比如;定时器回调/DOM事件回调/ajax回调
3,微列队:用来保存待执行的微任务(回调),比如;promise的回调/MutationObserver的回调
4,js执行时会区别这2个队列
(1)js引擎首先必须先执行所有的初始化同步任务代码
(2)每次准备取出第一个宏任务执行前,都要将所有的微任务一个一个取出来执行
*/