流程控制库async

简介:

看看npmjs.org里的模块依赖排行榜,async常期排在前三,可见此库确实不错,今天就来简单的说说它的作用


asyncnodejs里的流程控制模块,也可以用在浏览器端,主要是用来控制多个异步调用时的顺序以及依赖,在不用async之前,多个异步调用通常是这样的

fs.readFile('file1', function(){
    fs.readFile('file2', function(){
        fs.readFile('file3', function(){
            //.....
        })
    });
})

当业务比较复杂的时候,异步嵌套将会更深,这样就会形成异步地狱,这样非常不利于代码维护以及业务处理,而且对异常处理也不方便,下面我们来看看用async是怎么解决的,当然这种情况用promise机制来处理也可以,但是今天这里只讲async.

async.series

串行执行多个异步方法,使嵌套调用扁平化

async.series([
function(callback){
    fs.readFile('../data/file.txt', 'utf8', callback);
},
function(callback){
    fs.readFile('../data/file1.txt', 'utf8', callback);
}],
function(err, results){
    if(err) {
        console.log(err)
    }else{
        console.log(results);
    }
});

series允许传递两个参数,第一个参数代表要异步执行的所有函数,后一个参数是当前面所有异步执行完之后执行的一个回调函数,只要有一个异步方法异步,则直接执行回调函数,err参数就是异常信息,当所有的异步方法执行成功之后,回调函数里的result保存的前面所有异步方法执行的结果.

  • 注意代码里的callbackasync自己传递的固定参数不可更改.

series是串行执行的,也就是说当异步方法比较多的时候,其实串行执行的效率并不是很高,假如异步方法之前没有依赖关系的话,完全可以并行执行,下面我们来看看async提供的并行方法

async.parallel

并行执行多个异步方法,并返回多个结果组成的数组

async.parallel([
function(callback){
    fs.readFile('../data/file.txt', 'utf8', callback);
},
function(callback){
    fs.readFile('../data/file1.txt', 'utf8', callback);
}],
function(err, results){
    if(err) {
        console.log(err)
    }else{
        console.log(results);
    }
});

parallel在执行没有依赖关系的异步操作时候,效率还是不错的,回调函数跟上面的series一样,只要有一个异步方法出现异常,则传递异常信息给回调的第一个参数,都成功则results返回包含所有结果的数组.

  • 注意代码里的callbackasync自己传递的固定参数不可更改.

了解了串行和并行的方法之后,有一个问题那就是当后面的异步方法需要前面的异步方法返回的结果作为依赖的时候怎么办呢,async也提供了这样的方法

async.waterfall

前面异步方法返回的结果作为后面异步方法的条件,依次串行执行异步方法,最后返回最后一个异步方法的结果

async.waterfall([
function(callback){
    fs.readFile('../data/file.txt', 'utf8', function(err, content){
        callback(err, content);
    })
},
function(arg1, callback){
    fs.readFile('../data/' + arg1, 'utf8', callback);
}], 
function(err, results){
    if(err) {
        console.log(err)
    }else{
        console.log(results);
    }
})

waterfall方法就是用来处理异步方法之间的依赖的,这里跟上面的区别在于callback方法传递了两参数,null,content, 第一个参数代表是否异常;第二个参数代码当前异步方法返回的结果,这个值将会作为下一个异步方法的参数,比如这里的function(arg1, callback) ,arg1参数就是前一个异步方法返回传递的结果,假如后面的异步方法不需要前面的依赖则不用传递这个参数,像上面的第二异步方法那样

  • 注意代码里的callbackasync自己传递的固定参数不可更改.

当异步方法之前的依赖关系从一对一变到一对多了怎么办呢,上面的方法只有处理一对一的关系,一对多的话则不行,下面来看看async提供的超级好用的方法auto

async.auto

智能根据配置文件执行异步方法,支持一对多的情况

var deps = {
    'file': function(callback){
        fs.readFile('../data/file.txt', 'utf8', function(err, content){
            callback(err, content); // => file1.txt
        });
    },
    'file1': function(callback){
        fs.readFile('../data/file2.txt', 'utf8', function(err, content){
            callback(err, content); // => ../data/
        });
    },
    'action': ['file', 'file1', function(callback, result){
        fs.readFile(result.file1 + result.file, 'utf8', function(err, content){
            callback(err, { result: content, xuwm: 'feenan'});
        });
    }]
};

async.auto(deps, function(err, result){
    console.log(result);
});

auto方法会根据异步方法里的依赖关系,保证在依赖方法执行完成之后再去执行异步方法,auto允许传递两个参数,第一个参数是异步方法关系的定义,是一个key-vale方式的键值对,值传递单个函数则表示没有依赖,传递数组的话,数组内前面写上依赖的键值,最后写上异步方法.

  • 注意这里的异步方法会依赖前面异步方法返回的结果,所以callback会传递两参数,异常和结果

总结

其实async还有很多别的功能,本身也提供了很多数组相关的操作,更多信息请看这里async git.


目录
相关文章
|
5月前
|
JavaScript 前端开发
js开发:请解释什么是ES6的async/await,以及它如何解决回调地狱问题。
ES6的async/await是基于Promise的异步编程工具,简化了代码并提高可读性。它避免回调地狱,将异步操作转化为Promise,使得代码同步化。错误处理更直观,无需嵌套回调或.then()。
47 1
|
5月前
|
数据采集 关系型数据库 MySQL
python-协程(async、await关键字与asyncio)
python-协程(async、await关键字与asyncio)
215 0
|
2月前
|
JavaScript 前端开发 中间件
异步编程中使用 async/await 是否必须包含 try 和 catch 语句以实现错误处理?
异步编程中使用 async/await 是否必须包含 try 和 catch 语句以实现错误处理?
|
3月前
|
前端开发 JavaScript 定位技术
JavaScript 等待异步请求数据返回值后,继续执行代码 —— async await Promise的使用方法
JavaScript 等待异步请求数据返回值后,继续执行代码 —— async await Promise的使用方法
45 1
|
3月前
|
数据库 Python
我们来看一个简单的Python协程示例,它使用了`async`和`await`关键字。
我们来看一个简单的Python协程示例,它使用了`async`和`await`关键字。
|
5月前
|
前端开发 Python
探索Python中的异步编程:从回调到async/await
本文将深入探讨Python中的异步编程模式,从最初的回调函数到现代的async/await语法。我们将介绍异步编程的基本概念,探讨其在Python中的实现方式,以及如何使用asyncio库和async/await语法来简化异步代码的编写。通过本文,读者将能够全面了解Python中的异步编程,并掌握使用异步技术构建高效、响应式应用程序的方法。
|
5月前
|
Python
Python 的异步编程:什么是异步编程?Python 中的 `async` 和 `await` 关键字是用来做什么的?
【4月更文挑战第14天】Python中的异步编程利用`async`和`await`关键字提升并发性能和响应速度。异步函数在等待操作时可暂停,协程是轻量级线程,实现任务间切换。示例展示了如何定义异步函数和协程,以及如何通过`asyncio`库并发执行任务。
42 1
|
5月前
|
C#
C#学习系列相关之多线程(四)----async和await的用法
C#学习系列相关之多线程(四)----async和await的用法
|
5月前
|
调度 Python
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
65 0