异步处理学习

异步函数:不会立即执行,会被宿主环境控制;

浏览器宿主环境包含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:

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容