ES6/7 异步编程学习笔记
前言
在ES6的异步函数出现之前,Js实现异步编程只有settimeout、事件监听、回调函数等几种方法
settTmeout
这种方法常用于定时器与动画的功能,因为其本质上其实是浏览器的WebAPIs功能,因此与主线程并不同,当延时方法到达触发条件时,方法被添加到用于回调的任务队列,只要执行引擎栈中的代码执行完毕,主线程就会去读取任务队列,依次执行那些满足触发条件的回调函数。所以其等待时间在某些情况下往往不是那么准备,这一方面推荐可以看看《你不知道的js》这方面的章节。
事件监听
这一个方法其实在以jq为例的框架中比较常见,例如:a.on('click',function(){...})
优点:比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以”去耦合”,有利于实现模块化。
缺点:整个程序都要变成事件驱动型,运行流程会变得很不清晰。
回调函数
所谓回调函数,就是把任务的第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直接调用这个函数。
其实回调函数本身并没有什么问题,存在问题的是在很多情况下可能需要许多的回调函数去嵌套,这个时候就是所说的“回调地狱”
ES6/7: Promise、Generator、async/await
我对于Promise的认识就是将回调函数进行了优化以及封装,把回调嵌套的情况解决了,使用了链式代替,并增加了状态的管理,通过状态传递来保证回调的正确引用。简单举个栗子:
fun1()
.then(function(data){
console.log(data);
return fun2();
})
.then(function(data){
console.log(data);
return fun3();
})
.then(function(data){
console.log(data);
});
其中fun1,fun2,fun3三个函数都定义为Promise对象
generator最大的不同是会控制函数的执行和暂停,栗子为使用generator实现斐波那契数列:
function * fibonacci() {
let [prev, curr] = [1, 0];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
for (let n of fibonacci()) {
if (n > 1000) break;
console.log(n);
}
async/await则是generator的一个语法糖,将其进行了封装
同样实现一个斐波那契数列:
var fi = async function() {
var
t,
a = 0,
b = 1,
n = 0;
while (n < 10) {
await a;
[a, b] = [b, a + b];
n ++;
console.log(a)
}
return;
}
可以看出,与generator相比,async/await的优点在于1.有其内置的执行器。2.有着更好的语意性。3.其适用性更强:yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,可以跟 Promise 对象和原始类型的值
ES6/7 异步编程学习笔记的更多相关文章
- C#异步编程学习笔记之-async和await(续)
书接上文,本篇主要记录的内容要点:1.针对async和await在实际应用中的使用方式:2.异步方法返回值(有返回值和无返回值)的两种情况: 示例一(无返回值): using System; usin ...
- C#异步编程学习笔记之-async和await
一.异步方法介绍(async和await):如果使用async修饰符将某种方法指定为异步方法,即启用以下两种功能.1.标记的异步方法可以使用await来指定暂停点.await运算符通知编译器异步方法: ...
- 多线程编程学习笔记——使用异步IO(一)
接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...
- 多线程编程学习笔记——异步调用WCF服务
接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...
- 多线程编程学习笔记——使用异步IO
接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...
- 多线程编程学习笔记——async和await(一)
接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...
- 多线程编程学习笔记——async和await(二)
接上文 多线程编程学习笔记——async和await(一) 三. 对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...
- 多线程编程学习笔记——async和await(三)
接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五. 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...
- 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端
接上文 多线程编程学习笔记——使用异步IO 二. 编写一个异步的HTTP服务器和客户端 本节展示了如何编写一个简单的异步HTTP服务器. 1.程序代码如下. using System; using ...
随机推荐
- TCP:传输控制协议
概述: 书中采用了8章来介绍TCP,可见其重要性.TCP是一种面向连接的.可靠的字节流服务,也就是说两方要交换数据必须先建立一个连接. TCP的信息单位称为segment.TCP对字节流的内容不作任何 ...
- WebService的基本介绍
一.WebService的基本介绍 1.WebService是什么? WebService ---> Web Service web的服务 2.思考问题: WebService是we ...
- AIO5销售发货单numeric算数溢出报错:将numeric转换成数据类型numeric时出现算数溢出错误
问题描述: 销售发货单报错算数溢出:将numeric转换成数据类型numeric时出现算数溢出错误.具体如下图: 当销售发货单的数量为>7万时,报错 当销售发货单的数量为<7万时,单据正常 ...
- C#对SQLite、Access数据库操作的封装,很好用的~
1.对SQLite的封装: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Python开发目录
Python开发目录 Python之三目运算符 Python之文件的基本操作
- 实现JavaScript forEach
function forEach(list, callback){ ; n <list.length; n++){ callback.call(list[n], n); } } ,,,,,,,] ...
- KNN--用于手写数字识别
优点:精度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 适用数据范围:数值型和标称型 一般流程: (1). 收集数据(网络抓取) (2).处理数据,将数据处 ...
- Mysql实现企业级数据库主从复制架构实战
场景 公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公司业务中断,损失100万,老王做出深刻反省,公司 ...
- github与git之间怎么建立连接
git是一款强大的分布式版本控制系统,到底是什么意思呢?其实我也不知道,以后知道了再补上吧.下面咱们来讲一下github怎么与你电脑上的git建立起连接关系. 一.你要有一个github账号. 去百度 ...