参考文档:MDN
概念
ES7提供了一个异步解决方案async函数容易,它的作用非常简单,几个异步操作并且这几个是有依赖的,如果按照我们往常的使用方法有几种,下面是一个读取文件的例子,需要读取文件1-3.txt
,首先看看callback的写法:
readFile('1.txt', (err, data) => {
if(err) {return err}
let data1 = data;
readFile('2.txt', (err, data) => {
if(err) {return err }
let data2 = data;
readFile('3.txt', (err, data) => {
if(err) {return err}
let data3 = data;
return dataAll = data1.toString() + data2.toString() + data3.toString();
});
});
});
从上面的代码看出来,这样的回调函数很难辨别,也很难理解,而且多个回调函数嵌套,编写代码的人员也过后回头看也会感觉到头疼,这就是我们常说的"callback hell"。下面还有一种Promise的写法:
var files1 = new Promise((resolve, reject) => {
readFile('1.txt', (err, data) => {
if(err) {return err}
resolve(data);
});
});
var files2 = new Promise((resolve, reject) => {
readFile('2.txt', (err, data) => {
if(err) {return err}
resolve(data);
});
});
var files3 = new Promise((resolve, reject) => {
readFile('3.txt', (err, data) => {
if(err) {return err}
resolve(data);
});
});
files1.then((data1) => {
files2.then((data2) => {
files3.then((data3) => {
/* Code */
});
});
});
当然还有其他的写法,Promise+Generator、co模块、Thunk函数等方法,但是我觉得ES7提出的async是解决异步编程的终极方案,非常容易理解语义,写起来思路也非常清晰,async通过async
命令来标识这是一个async函数,通过在函数内部用await
标识这是一个需要等待执行完毕的异步操作。在使用async之前有几点需要先了解一下:
- 非常容易理解的语义,在函数前加上async标注这是一个异步函数容器。async翻译过来为
异步
。 -
在async内部通过
await
标注这个操作需要等待执行完毕后才执行下一个操作。await翻译过来为等待
-
async函数内部通过return语句返回值,用于then方法的回调函数参数
-
async函数返回一个Promise对象,并且这个Promise对象的状态是等待所有await命令执行完毕后才凝固。
-
只要async函数内部的await命令后面发生了错误,就会触发
rejected
状态,并且被外部的catch
方法回调函数捕获。 -
await
语句后面的是一个Promise对象,如果不是就转换为Promise对象
用法
下面来看看用async来实现上面的代码
function readFileCase(fileanme){
readFile('1.txt', (err, data) => {
if(err) {return err}
return data;
})
}
async function files(){
let data1 = await readFileCase('1.txt');
let data2 = await readFileCase('2.txt');
let data3 = await readFileCase('3.txt');
return (data1.toString() + data2.toString() + data3.toString());
}
files()
.then((data) => {
console.log(data);
})
.catch((err) => {
console.log(err);
});
上面的例子先定义了一个函数来封装readFile
函数,返回一个data值。async函数内部,在需要等待异步操作执行函数的前面添加await
语句,使用async函数来操作异步编程语义非常清晰。
文完
《ES7-async函数》留言数:0