前言

在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 异步编程学习笔记的更多相关文章

  1. C#异步编程学习笔记之-async和await(续)

    书接上文,本篇主要记录的内容要点:1.针对async和await在实际应用中的使用方式:2.异步方法返回值(有返回值和无返回值)的两种情况: 示例一(无返回值): using System; usin ...

  2. C#异步编程学习笔记之-async和await

    一.异步方法介绍(async和await):如果使用async修饰符将某种方法指定为异步方法,即启用以下两种功能.1.标记的异步方法可以使用await来指定暂停点.await运算符通知编译器异步方法: ...

  3. 多线程编程学习笔记——使用异步IO(一)

    接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...

  4. 多线程编程学习笔记——异步调用WCF服务

    接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...

  5. 多线程编程学习笔记——使用异步IO

    接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...

  6. 多线程编程学习笔记——async和await(一)

    接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...

  7. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

  8. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  9. 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端

    接上文 多线程编程学习笔记——使用异步IO 二.   编写一个异步的HTTP服务器和客户端 本节展示了如何编写一个简单的异步HTTP服务器. 1.程序代码如下. using System; using ...

随机推荐

  1. 【复习】VueJS之内部指令

    Vuejs 源码:https://github.com/zhuangZhou/vuejs 下载Vue.js 官网:http://vuejs.org live-server使用 live-server是 ...

  2. VueJS引入css或者less文件的一些坑

    我们在做Vue+webpack的时,难免会引入各种公共css样式文件,那么我们改如何引入呢?引入时会有那些坑呢? 首先,引入公共样式时,我们在“main.js”里使用AMD的方式引入,即 requir ...

  3. .net 系列:事件和委托

    在.net 的世界里,离不开委托和事件,其实理解透了后很简单,总结了一下分为5步:   1)定义委托   public delegate void RevicedEventHandler(object ...

  4. 【笔记】web 的回流与重绘及优化

    最近看了幕课网 web 前端性能优化的课程,其中说到了浏览器的回流(reflow) 及 重绘(repaint).觉得以后面试或许会被问到所以做一下笔记: 课程从回流及重绘这两个点延伸出了一个知识点就是 ...

  5. IDisposeable,Close

    一.资源分类 资源分为托管资源和非托管资源. 非托管资源:所有的windows内核对象(句柄)都是非托管资源,如stream,数据库连接,GDI+和COM对象等,这些资源不受CLR管理. 托管资源:由 ...

  6. javaScript基础概念小知识点集

    数据类型 typeof是一个操作符而不是函数,因此例子中圆括号尽管可以使用,但不是必须的. 只要在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null NaN是一个特殊的数值,与任何值都 ...

  7. 计算出前N项的数据

    #include<iostream> #include<algorithm> #include<numeric> using namespace std; ; in ...

  8. git的CentOS服务端安装和windows客户端的使用

    git的CentOS服务端安装和windows客户端的使用 此教程以 搬瓦工vps CentOS 6 x64 的系统为环境,搭建 git 服务端.windows 7 系统为客户端. git客户端 在W ...

  9. ESLint 的正式使用感受

    介绍ESLint ESLint 是一个代码规范和错误检查工具,有以下几个特性 所有东西都是可以插拔的.你可以调用任意的rule api或者formatter api 去打包或者定义rule or fo ...

  10. gem install报错

    [root@app-test ruby-2.2.3]# gem install capistrano -v 2.15 ERROR:  While executing gem ... (Gem::Rem ...