前言

在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() {vart,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 对象和原始类型的值

转载于:https://www.cnblogs.com/cheerup/p/8157898.html

ES6/7 异步编程学习笔记相关推荐

  1. 【异步编程学习笔记】JDK中的FutureTask和CompletableFuture详解(使用示例、源码)

    文章目录 FutureTask概述 使用实例 类图结构 FutureTask的run()方法 FutureTask的局限性 CompletableFuture概述 CompletableFuture代 ...

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

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

  3. 多线程编程学习笔记——任务并行库(二)

    接上文 多线程编程学习笔记--任务并行库(一) 三.   组合任务 本示例是学习如何设置相互依赖的任务.我们学习如何创建一个任务的子任务,这个子任务必须在父任务执行结束之后,再执行. 1,示例代码如下 ...

  4. 多线程编程学习笔记——使用并发集合(三)

    接上文 多线程编程学习笔记--使用并发集合(一) 接上文 多线程编程学习笔记--使用并发集合(二) 四.   使用ConcurrentBag创建一个可扩展的爬虫 本示例在多个独立的即可生产任务又可消费 ...

  5. 多线程编程学习笔记——线程池(二)

    接上文 多线程编程学习笔记--线程池(一) 三.线程池与并行度 此示例是学习如何应用线程池实现大量的操作,及与创建大量线程进行工作的区别. 1. 代码如下 using System; using Sy ...

  6. WCF服务编程 学习笔记(1)

    你或许可以使用某一技术实现某些功能,可以按着指定的要求,完成特定的功能,实现某一想要的效果,这表示你可以使用该技术,会使用该技术,但是我们不能停留在使用的层次上,还要了解它们的运行机制,可能有点深了, ...

  7. Vue学习(增删改查、ES6模块化概念)-学习笔记

    文章目录 Vue学习(增删改查.ES6模块化概念)-学习笔记 增删改查案例 ES6模块化概念 Vue学习(增删改查.ES6模块化概念)-学习笔记 增删改查案例 <!DOCTYPE html> ...

  8. 多线程编程学习笔记——任务并行库(三)

    接上文 多线程编程学习笔记--任务并行库(一) 接上文 多线程编程学习笔记--任务并行库(二) 六.   实现取消选项 本示例学习如何实现基于Task的异步操作进行取消流程,以及在任务真正运行前如何知 ...

  9. Linux与C++11多线程编程(学习笔记)

    多线程编程与资源同步 在Windows下,主线程退出后,子线程也会被关闭; 在Linux下,主线程退出后,系统不会关闭子线程,这样就产生了僵尸进程 3.2.1创建线程 Linux 线程的创建 #inc ...

最新文章

  1. mysql cluster (mysql 集群)安装配置方案
  2. java手机杀毒_Android项目实战_手机安全卫士splash界面
  3. 工业用微型计算机(22)-指令系统(18)
  4. 服务发现技术是如何演进出来的?
  5. mysql游标表间数据迁移_MySQL存储过程--通过游标遍历和异常处理迁移数据到历史表...
  6. 理解Windows窗体和WPF中的跨线程调用
  7. 23种设计模式之备忘录模式
  8. ACM模式数组构建二叉树
  9. tipask二次开发总结_二次开发自我总结
  10. Mysql中给数据库,表,字段设置字符编码
  11. 总结一些Android好用的开源库
  12. java9 32位官网下载_jdk1.9 32位官方下载
  13. 移动硬盘做笔记本硬盘
  14. 国美易卡设计构架的思维模式(国美易卡)
  15. Scala之特质特质Trait
  16. [保研直硕直博经验分享-2019] (上海交大计算机系夏令营+九推)
  17. JavaScript闭包的个人理解
  18. 改变自己是神,改变别人是神经病
  19. 苹果5G芯片研发失败:继续依赖高通,还要担心被起诉?
  20. 曾李青的五年投资经验总结:早期创业公司的九种死法

热门文章

  1. Spring MVC 基础
  2. 计算机科学中最重要的32个算法(转)
  3. 福州大学计算机专业排名2018,软科2018年世界一流学科排名发布 福州大学9个学科上榜...
  4. 华为复制加密门禁卡_MIUI12轻体验:关于模拟门禁卡,你想知道的都在这里
  5. python计算运动会某个参赛选手的得分。数据保存在文件中_Python基础教程之第二章---变量和字符串(1) 搬运...
  6. 设计模式复习-迭代器模式
  7. POJ1486模拟或者匈牙利变种
  8. LA3177长城守卫
  9. hdu4772 水模拟
  10. 【错误记录】Android Studio 编译报错 ( Installed Build Tools revision 31.0.0 is corrupted )