ES7-async函数

参考文档: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之前有几点需要先了解一下:

  1. 非常容易理解的语义,在函数前加上async标注这是一个异步函数容器。async翻译过来为异步

  2. 在async内部通过await标注这个操作需要等待执行完毕后才执行下一个操作。await翻译过来为等待

  3. async函数内部通过return语句返回值,用于then方法的回调函数参数

  4. async函数返回一个Promise对象,并且这个Promise对象的状态是等待所有await命令执行完毕后才凝固。

  5. 只要async函数内部的await命令后面发生了错误,就会触发rejected状态,并且被外部的catch方法回调函数捕获。

  6. 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函数来操作异步编程语义非常清晰。

文完

文档信息

发表评论

电子邮件地址不会被公开。 必填项已用*标注