异步函数:不会立即执行,会被宿主环境控制;
浏览器宿主环境包含5个线程:
js引擎:负责执行执行栈最顶部代码;
gui线程:负责渲染页面;
事件监听线程:负责监听各种事件;
计时线程:负责计时;
网络线程:负责网络通信;
当以上的线程发生了某些事件,并且该事件需要处理,它会将该处理程序加入事件队列的内存中,当js引擎发现执行栈中没有内容后,会将事件队列中的第一个函数加入到执行栈中执行;js引擎对事件队列的取出执行方式以及与宿主环境的配合,称之为事件循环;
事件队列分为:
宏队列:计时器,ajax事件等;
微队列:promise产生的回调会进入微队列;mutationObserver:监听某个dom对象发生变化;
promise:
规范:
未决:pending挂起状态
已决:fulfilled完成状态、rejected失败状态
挂起-〉完成,称为resolve;挂起-〉失败称为rejected,状态固定下来,永远无法改变;成功可能有个相关数据,失败可能有个失败原因。
API:
.then(成功) ;.catch(失败);.then(null,失败) =.catch(失败)
then:会产生一个新的promise; 如果没有做对应执行状态下的后续处理,新任务和旧任务状态一致,数据也跟前一个任务一致;如果后续处理,处理的过程不报错新任务就算成功,否则就是失败;函数没有返回值就是,返回一个error不影响状态,抛出一个异常状态为reject;
const pro1 = new Promise((resolve,reject)=>{
resolve(1)
})
const pro2 = pro1.then((data)=>{
//有相关后续处理,看代码是都能成功执行
console.log(data,'pro2')
return 111
})
const pro3 = pro2.then((data)=>{
//有相关后续处理,看代码是都能成功执行
console.log({data},"pro3")
})
console.log(pro1,pro2,pro3)//<fulfilled>: 1;<fulfilled>: 111;<fulfilled>:undefined
promise静态方法:
//Promise.all 全部成功就是成功,有一个失败状态就是失败并返回失败原因
const pro = Promise.all([cook(),wash(),sweep()])
setTimeout(()=>{
console.log({pro})
},3000)
//Promise.any 有一个任务成功就是成功,全部请求失败才是失败
const pro1 = Promise.any([cook(),wash(),sweep()])
setTimeout(()=>{
console.log({pro1})
},3000)
pro1.catch(err=>{
console.log({err})//AggregateError: All promises were rejected
})
//Promise.allSettled 返回Promise对象状态汇总结果在PromiseResult里面,其中一个Promise挂起就返回pending,PromiseResult为undefined;
const pro3 = Promise.allSettled([cook(),wash(),sweep()])
//Promise.race 返回第一个有结果的Promise对象,成功就返回成功,失败就返回失败;
const pro4 = Promise.race([cook(),wash(),sweep()]
async和await: