- 1、本文档共28页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ECMAScript6异步操作和Async函数
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)