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 伪数组实现方法
Oct 11 Javascript
jQuery 选择器、DOM操作、事件、动画
Nov 25 Javascript
JS简单实现文件上传实例代码(无需插件)
Nov 15 Javascript
js用typeof方法判断undefined类型
Jul 15 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
Oct 17 Javascript
javascript实现简单的省市区三级联动
May 14 Javascript
JQuery中DOM实现事件移除的方法
Jun 13 Javascript
Javascript显示和隐藏ul列表的方法
Jul 15 Javascript
easyui form validate总是返回false的原因及解决方法
Nov 07 Javascript
Webpack之tree-starking 解析
Sep 11 Javascript
React router动态加载组件之适配器模式的应用详解
Sep 12 Javascript
小程序实现五星点评效果
Nov 03 Javascript
聊聊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
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
如何在PHP程序中防止盗链
2008/04/09 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
p5.js码绘“跳动的小正方形”的实现代码
2019/10/22 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
python 重命名轴索引的方法
2018/11/10 Python
python实现简单五子棋游戏
2019/06/18 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
Python笔记之facade模式
2019/11/20 Python
python实现IOU计算案例
2020/04/12 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
幼儿园大班家长评语
2014/04/17 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
继承权公证书范本
2015/01/23 职场文书
2016年端午节红领巾广播稿
2015/12/18 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书