1.基本概念
Javascript语言的执行环境是“单线程”的,如果没有异步编程,根本没法用,非卡死不可。
ES6诞生以前,异步编程的方法,大概有下面四种。
- 回调函数
- 事件监听
- 发布/订阅
- Promise 对象
ES6将JavaScript异步编程带入了一个全新的阶段,ES7的Async
函数更是提出了异步编程的终极解决方案。
回调函数
JavaScript语言对异步编程的实现,就是回调函数。所谓回调函数,就是把任务的第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直接调用这个函数。它的英语名字callback,直译过来就是"重新调用"。
读取文件进行处理,是这样写的。
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
console.log(data);
});
一个有趣的问题是,为什么Node.js约定,回调函数的第一个参数,必须是错误对象err(如果没有错误,该参数就是null)?原因是执行分成两段,在这两段之间抛出的错误,程序无法捕捉,只能当作参数,传入第二段。
回调函数本身并没有问题,它的问题出现在多个回调函数嵌套。这是代码的可读性就很差了,Promise将回调函数的嵌套,改成链式调用
async函数
ES7提供了async
函数,使得异步操作变得更加方便。async
函数是什么?一句话,async
函数就是Generator函数的语法糖。
下面的例子读取两个文件
var asyncReadFile = async function (){
var f1 = await readFile('/etc/fstab');
var f2 = await readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
};
学习文档:ECMAScript 入门----阮一峰