JS ES6异步解决方案


Posted in Javascript onApril 29, 2021

最初使用回调函数

​ 由于最初j s官方没有明确的规范,各种第三方库中封装的异步函数中传的回调函数中的参数没有明确的规范, 没有明确各个参数的意义, 不便于使用。

​ 但是node中有明确的规范

​ node中的的回调模式:

1. 所有回调函数必须有两个参数,第一个参数表示错误,第二个参数表示结果

2. 所有回调函数必须作为函数最后的参数

3. 所有回调函数不能作为属性出现

es6 异步处理模型

Es6 出现以后, 官方就提出了异步处理的规范, 提出了一种适用于所有异步场景的处理模型。该模型有:

  • 两个阶段: 未决unsettled, 已决settled。
  • 三个状态: pending挂起状态 , resolved成功, rejected失败
  • 总是从未决阶段推向已决阶段,且已决阶段的状态不再改变

任务已决状态后可能需要后续处理,

  • 针对resolved的后续处理我们称之为thenable
  • 针对rejected的后续处理我们称之为catchable

为该异步模型量身打造的API : promise

如何使用promise

Copy

const task = new Promise((resolve, reject) => {     
    // 任务未决阶段代码  
    // 立即执行  
    console.log("开始100米长跑");  
    setTimeout(() => {  
       if (Math.random() > 0.5) {  
           // 成功: 跑完了  
           // 推向成功  
           resolve("跑完了");  
       } else {  
           // 失败: 腿摔断了  
           // 推向失败  
           reject("腿摔断了");  
       }  
    }, 1000)
});
task.then((result) => {
  console.log(result);
}).catch((error) => {
  console.log(error);
})

1s 后任务推向已决, 后续处理在then 或者 catch中 处理。

注意

pending状态 =》rejected状态 :

Copy

1. 调用reject

2. 代码执行报错

3. 手动抛出错误

后续处理函数一定是异步的,且会放到微队列中,

j s执行栈清空后会先执行微队列中的任务,微队列里任务清空后才会执行宏队列中的任务。

  • 宏任务队列有:setTimeout,setInterval,setImmediately,I/O,UI render
  • 微任务队列有:promise,process.nexttick,Object.observe(已经不用了),Mutation.observe

Async await 是es7新增的promise的语法糖大家也可以了解下,本文只是对promise做了个概述,要掌握的其他细节还有很多

以上就是JS ES6异步解决方案的详细内容,更多关于ES6异步解决方案的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript 写的一个简单的timer
Jul 30 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
Dec 11 Javascript
HTML5之lang属性与dir属性的详解
Jun 19 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
Jun 21 Javascript
倒记时60刷新网页的js代码
Feb 18 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
Sep 03 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
Mar 03 Javascript
Node.js的Web模板引擎ejs的入门使用教程
Jun 06 Javascript
原生JS实现简单放大镜效果
Feb 08 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 jQuery
JavaScript find()方法及返回数据实例
Apr 30 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 Vue.js
聊聊JS ES6中的解构
Apr 29 #Javascript
详解TypeScript中的类型保护
Apr 29 #Javascript
7个你应该知道的JS原生错误类型
Apr 29 #Javascript
使用vue-element-admin框架从后端动态获取菜单功能的实现
如何使用JavaScript策略模式校验表单
Apr 29 #Javascript
react中props 的使用及进行限制的方法
Apr 28 #Javascript
React Hook用法示例详解(6个常见hook)
You might like
php adodb连接不同数据库
2009/03/19 PHP
php绘图之加载外部图片的方法
2015/01/24 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
JavaScript生成随机字符串的方法
2015/03/19 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
JQuery中clone方法复制节点
2015/05/18 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
JS获取字符串实际长度(包含汉字)的简单方法
2016/08/11 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
2018/11/21 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
[56:17]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
python实现支付宝转账接口
2019/05/07 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
Python Celery多队列配置代码实例
2019/11/22 Python
对python中return与yield的区别详解
2020/03/12 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
简单了解python列表和元组的区别
2020/05/14 Python
Django设置Postgresql的操作
2020/05/14 Python
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
澳大利亚优质葡萄酒专家:Vintage Cellars
2019/01/08 全球购物
美国波西米亚风格精品店:South Moon Under
2019/10/26 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
小学教师办公室制度
2014/02/03 职场文书
公安机关正风肃纪剖析材料
2014/10/10 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang