利用ES6进行承诺封装的案例

  介绍

这篇文章主要介绍了利用ES6进行承诺封装的案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

<强>原生承诺解析

<强>简介

承诺是异步编程的一种解决方案,比传统的解决方案,回调函数和事件,更合理和强大。

承诺简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,从语法上来说,承诺是一个对象,从它可以获取异步操作的消息,承诺提供统一的API,各种异步操作都可以用同样的方法进行处理

<强>特点

对象的状态不受外界影响,承诺对象代表一个异步操作,有三种状态:挂件,满足,拒绝。只有异步操作的结果,可以决定当前是哪一种状态,其他操作都无法改变这个状态。

一旦状态改变,就不会在变,任何时候都可以得到这个结果,只有两种可能:从挂件变为满足和从挂件变为拒绝。只要这两种情况发生,状态就凝固了,会一直保持这个结果,这时就称为解决。

<>强利用ES6进行承诺封装

处理同步任务

原生方法调用方式

,, new 承诺((解决,拒绝)=祝辞{   ,,,解决(1)   }),然后才能(res=祝辞{   ,,,console.log (res),//1   })才能

同步封装思考

1。由调用方式可见承诺是一个类
2。它接收一个回调函数,这个回调函数接受解决和拒绝方法作为参数
3。当状态改变后执行然后方法,并将解决或拒绝的结果作为然后方法接受回调函数的参数

,, class  Mypromise {   ,,,构造函数(回调){   ,,,,,this.status=& # 39; pendding& # 39;   ,,,,,//成功结果   ,,,,,this.s_res =零   ,,,,,//,失败结果   ,,,,,this.f_res =零   ,,,,,回调((arg)=祝辞{//大敌;使用箭头函数这个不会丢失   ,,,,,,//,改变状态为成功   ,,,,,,this.status =, & # 39;实现# 39;   ,,,,,,this.s_res =参数   ,,,,,},(arg)=祝辞{   ,,,,,,,//,改变状态为失败   ,,,,,,,this.status =, & # 39;拒绝# 39;   ,,,,,,,this.f_res =, arg    ,,,,,})   ,,,}   ,,,然后(onresolve onreject) {   ,,,,,如果(this.status ===, & # 39;实现# 39;){//大敌;当状态为成功时   ,,,,,,,onresolve (this.s_res)   ,,,,,}else 如果(this.status ===, & # 39;拒绝# 39;){//大敌;当状态为失败时   ,,,,,,,onreject (this.f_res)   ,,,,,}   ,,,}   以前,,}

<强>处理异步任务

原生调用方式

,, new 承诺((解决,拒绝)=祝辞{   ,,,setTimeOut(()=祝辞{   ,,,,,解决(1)   ,,,},1000)   }),然后才能(res=祝辞{   ,,,console.log (res)   })才能

异步封装思考

1。根据js执行机制,setTimeOut属于宏任务,然后回调函数属于微任务,当主线程执行完成后,会从异步队列中取出本次的微任务先执行。

2。也就是说,方法执行时,状态还没有改变,所有我们需要将那方法执行的回调保存起来,等到异步代码执行完成后,在统一执行然后方法的回调函数

,, class  Mypromise {   ,,,构造函数(回调){   ,,,,,this.status=& # 39; pendding& # 39;   ,,,,,//成功结果   ,,,,,this.s_res =零   ,,,,,//,失败结果   ,,,,,this.f_res =零   ,,,,,this.query =, [],//, + +,   ,,,,,回调((arg)=祝辞{//大敌;使用箭头函数这个不会丢失   ,,,,,,//,改变状态为成功   ,,,,,,this.status =, & # 39;实现# 39;   ,,,,,,this.s_res =参数   ,,,,,,//,当状态改变后,统一执行然后方法的回调   ,,,,,,this.query.forEach(项=祝辞{   ,,,,,,,,item.resolve (arg)   ,,,,,,})   ,,,,,},(arg)=祝辞{   ,,,,,,,//,改变状态为失败   ,,,,,,,this.status =, & # 39;拒绝# 39;   ,,,,,,,this.f_res =, arg    ,,,,,,,//,当状态改变后,统一执行然后方法的回调   ,,,,,,this.query.forEach(项=祝辞{   ,,,,,,,,item.reject (arg)   ,,,,,,})   ,,,,,})   ,,,}   ,,,然后(onresolve onreject) {   ,,,,,如果(this.status ===, & # 39;实现# 39;){//大敌;当状态为成功时   ,,,,,,,onresolve (this.s_res)   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

利用ES6进行承诺封装的案例