async简单使用

       node的异步io虽然好用,但是控制异步流程确实一个比较麻烦的事情,比如在爬虫中控制并发数量,避免并发过大导致网站宕机或被加入黑名单。因此需要一个工具来控制并发,这个工具可以自己写或者使用async(官方文档点击这里)。代码基于node 8.x,如版本过低可能会出现错误。

说明

        async本身有七十多个方法,这里只说明几个比较常用的简单函数用法,想进一步学习可参考文档。总的来说分为两大类。

一、第一个参数为​​函数集合,也​​就是遍历执行集合中的函数。

  1.顺序执行 series(tasks , function(err,res){ })

        tasks为函数数组,数组中的每一项都为待执行函数。

          a.下面是一个最简单示例,待执行函数为非异步
 1 const asyncx = require( 'async' );
 2 
 3 let tasks = [];
 4 for( let i = 0 ; i < 10 ; i++ )
 5 {
 6     tasks.push(
 7         function( callback ){
 8             //dosomething
 9             console.log( i );
10             //本函数用来通知async本次任务完成情况,并把结果带出去。
11             callback( null , i ); //第一个参数为异常参数,如果传入一个error( 比如new Error('error') ),并发结束,调用series里的回调。
12         }
13     )
14 }
15 asyncx.series( tasks , function(err , res ){
16     if( err )
17         console.log( err );
18     console.log( res );
19 } )

运行结果

        b.待执行函数为异步

        如果待处理的函数也是异步函数可将callback参数传入到异步函数中,在真正结束的时候调用callback。

 1 const asyncx = require( 'async' );  //模块命名为asyncx避免和es7中的async/await冲突
 2 
 3 let tasks = [];
 4 for( let i = 0 ; i < 10 ; i++ )
 5 {
 6     tasks.push(
 7         function( callback ){
 8             setTimeout( function(){
 9                 console.log(i);
10                 callback( null , 1 ); //在这里整个处理才是真正完成,然后调用callback通知async本任务结束
11             } , 2000 );
12         }
13     )
14 }
15 asyncx.series( tasks , function(err , res ){
16     if( err )
17         console.log( err );
18     console.log( res );
19 } )

    如果想要在任务中使用es7的async/await 可将待处理代码放在一个闭包中(直接在function前加async会报错),下面示例。

 1 const asyncx = require( 'async' );  //模块命名为asyncx避免和es7中的async/await冲突
 2 
 3 let tasks = [];
 4 for( let i = 0 ; i < 10 ; i++ )
 5 {
 6     tasks.push(
 7         function( callback ){
 8             (async function(){
 9                 let sum = await doSomething( i );
10                 callback( null , sum );
11             })();
12         }
13     )
14 }
15 
16 async function doSomething( i ){
17     return new Promise( function( resolve , reject ){
18         setTimeout(function(){
19             console.log( i );
20             resolve( i );
21         } , 1000 );
22     } );
23 }
24 
25 asyncx.series( tasks , function(err , res ){
26     if( err )
27         console.log( err );
28     console.log( res );
29 } )
    2.并发执行 parallel( tasks , function(err,res){} )

        参数如上,不限制并发

    3.并发限制执行parallelLimit( tasks , num , function(err,res){} )

        参数同上,num为最大并发数量

二、第一个参数为非​​​​函数集合。

    比如

async.map(['file1','file2','file3'], function(item,callback){
    //dosomething
    callback( null , 'done' );
    }, function(err, results) {
    // results is now an array of stats for each file
});

    第二个参数为一个异步函数,要能接受两个参数item(前面集合中的一项),callback 通知async任务完成

    还有其他的函数用法都是类似只是具体作用不一样。可参考官方文档说明。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • node封装mysql操作

            node是基于异步的,因此在进行数据库查询操作的通常是通过回调来操作查询结果。但是在有了es7的async/await,基本不再需要回调了,所以...

    用户2038589
  • spring基础(3:面向切面编程)

      Spring的基础是IOC和AOP,前面两节对IOC和DI做了简单总结,这里再对AOP进行一个学习总结,Spring基础就算有一个初步了解了。

    用户2038589
  • 说反话(c++实现)

    输入:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间...

    用户2038589
  • 如何优雅地处理Async/Await的异常?

    async/await 中的异常处理很让人混乱。尽管有很多种方式来应对async 函数的异常,但是连经验丰富的开发者有时候也会搞错。

    Fundebug
  • RabbitMQ 学习笔记3 - 使用amqp库连接RabbitMQ

    使用Go 操作RabbitMQ 收发消息,可以 使用Go RabbitMQ客户端库 连接 RabbitMQ 来实现。

    zhangyunfeiVir
  • RabbitMQ性能测试

    作者一直在寻找一个极低延时的消息队列,从目前的测试结果来看,只有nats达到了<1ms的水平,本文旨在测试rabbitmq的国latency,撰文记录并与大家分...

    王亚昌
  • 远程升级准备工作: 安装Web服务器

      前言:大家可以安装Apache,Tomcat,nginx 等Web服务器软件,这篇文章安装 OpenResty 作为Web服务器软件,该软件安装在云端电脑,...

    杨奉武
  • nodejs之async模块

    async模块是为了解决嵌套金字塔,和异步流程控制而生,常用方法有series、parallel、waterfall、parallelLimit、auto、wh...

    无邪Z
  • iOS页面切换的几种方式

    4.UINavigationController实现多层画面跳转,在导航控制器中,载入有层级关系的界面

    用户3004328
  • 荐读|知道未来的8个趋势,让你少奋斗10年

    每件新事物的兴起的时候,或者一个新的时代将要到来的时候,总会有很小的部分人会提前觉察到,进而引领着这个新事物或者新时代的发展,这样的人不多,大概只有2%。 还有...

    灯塔大数据

扫码关注云+社区

领取腾讯云代金券