ECMAScript 6 异步操作及Async函数.pdf

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ECMAScript 6 异步操作和Async函数 1. 基本概念 2. Generator 函数 3. Thunk 函数 4 . co模块 5. async函数 异步编程对JavaScript语⾔太重要。Javascript语⾔的执⾏环境是“单线程”的,如果没 异步编程,根本没法⽤,⾮卡死不可。 ES6诞⽣以前,异步编程的⽅法,⼤概 下⾯四种。 回调函数 事件监听 发布/订阅 romise 对象 ES6将JavaScript异步编程带⼊了⼀个全新的阶段,ES7的Async函数更是提出了异步 编程的终极解决⽅案。 基本概念 异步 所谓异步 ,简单说就是⼀个任务分成两段,先执⾏第⼀段,然后转⽽执⾏其他任 务,等做好了准备,再回过头执⾏第⼆段。 ⽐如, ⼀个任务是读取⽂件进⾏处理,任务的第⼀段是向操作系统发出请求,要求 读取⽂件。然后,程序执⾏其他任务,等到操作系统返回⽂件,再接着执⾏任务的第 ⼆段 (处理⽂件)。这种不连续的执⾏,就叫做异步。 相应地,连续的执⾏就叫做同步。由于是连续执⾏,不能插⼊其他任务,所以操作系 统从硬盘读取⽂件的这段时间,程序只能⼲等着。 回调函数 JavaScript语⾔对异步编程的实现,就是回调函数。所谓回调函数,就是把任务的第⼆ 段单独写在⼀个函数⾥⾯,等到重新执⾏这个任务的时候,就直接调⽤这个函数。它 的英语名字callback ,直译过来就是重新调⽤。 读取⽂件进⾏处理,是这样写的。 fs.readFile(/etc/passwd, function (err, data) { if (err) throw err; console.log(data); }); 上⾯代码中,readFile函数的第⼆个参数,就是回调函数,也就是任务的第⼆段。等到 操作系统返回了/etc/passwd这个⽂件以后,回调函数才会执⾏。 ⼀个 趣的问题是,为什么Node .j s约定,回调函数的第⼀个参数,必须是错误对象 err (如果没 错误,该参数就是null )?原因是执⾏分成两段,在这两段之间抛出的 错误,程序⽆法捕捉,只能当作参数,传⼊第⼆段。 Promise 回调函数本⾝并没 问题,它的问题出现在多个回调函数嵌套。假定读取A⽂件之 后,再读取B⽂件,代码如下。 fs.readFile(fileA, function (err, data) { fs.readFile(fileB, function (err, data) { // ... }); }); 不难想象,如果依次读取多个⽂件,就会出现多重嵌套。代码不是纵向发展,⽽是横 向发展,很快就会乱成⼀团,⽆法管理。这种情况就称为回调函数噩梦 (callback hell )。 romise就是为了解决这个问题⽽提出的。它不是新的语法功能,⽽是⼀种新的写法, 允许将回调函数的嵌套,改成链式调⽤。采⽤ romise ,连续读取多个⽂件,写法如 下。 ar readFile = require(fs-readfile-promise); readFile(fileA) .then(function(data){ console.log(data.toString()); }) .then(function(){ return readFile(fileB); }) .then(function(data){ console.log(data.toString()); }) .catch(function(err) { console.log(err); }); 上⾯代码中,我使⽤了fs-readfile-promise模块,它的作⽤就是返回⼀个 romise版本的 readFile函数。 romise提供then⽅法加载回调函数,catch⽅法捕捉执⾏过程中抛出的 错误。 可以看到, romise 的写法只是回调函数的改进,使⽤then⽅法以后,异步任务的两段 执⾏看得更清楚了,除此以外,并⽆新意。 romise 的最⼤问题是代码冗余,原来的任务被 romise 包装了⼀下,不管什么操作, ⼀眼看去都是⼀堆 then ,原来的语义变得很不清楚。 那么, 没 更好的写法呢? Generator函数 协程 传统的编程语⾔,早 异步编程的解决⽅案 (其实是多任务的解决⽅案)。其中 ⼀ 种叫做协程

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档