VIP用户交流群:462197261 收藏本站北冥有鱼 互联网前沿资源第一站 助力全行业互联网+
在线客服:78895949
tonglan
  • 当前位置:
  • Nodejs异步流程框架async的方法

    建站教程 2019年11月09日 关键词:,,,

    Async的简单介绍:

    Async是一个流程控制工具包,提供了直接而强大的异步功能。基于Javascript为Node.js设计,同时也可以直接在浏览器中使用。Async提供了大约20个函数,包括常用的map, reduce, filter, forEach等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。

    https://github.com/caolan/async

    我们常用的是以下四种:

    • 串行无关联
    • 串行有关联
    • 并行无关联
    • 智能控制

    1.async.series:串行无关联:

    多个函数或方法要依次执行,但是他们之间并没有什么联系,只有先后的顺序,比如我要写一个文件,写完之后像用户发送邮件,这两者之间没有必然的联系,但是发邮件必须在写文件完成之后。
    async里有一个方法series可以实现这一流程,代码实现如下:

    var async = require('async');
    console.time('series');
    async.series({
      one: function(callback) {
        callback(null, 'one');//callback('i am err','one');异常处理
      },
      two: function(callback) {
        callback(null, 'two');
    
      },
    }, function(error, result) {
      //最后结果
      console.log('error: ' + error);
      console.log('result: ' + result);
      console.timeEnd('series');
    });
    
    // error: null
    // result: [object Object]
    // series: 4.472ms
    
    

    2.async.waterfall:串行有关联

    瀑布流函数,串行执行数组中的每一个函数最后执行回调。 语法:async.waterfall(tasks,callback) 第一个参数tasks是一个数组,数组包含的是需要依次执行的函数。

    第二个参数为回调函数,当瀑布流函数(即tasks数组中的函数)执行出现错误时会执行这个回调函数并将错误信息返回,当瀑布流函数无错误时,会在执行完tasks数组中包含的函数后执行这个回调函数。

    用法示例: 一般用法:

    async.waterfall([
      myFirstFun,
      mySecondFun,
      myLastFun
    ],function(err,result) { // result回调函数
      // result 相当于tasks数组中最后一个函数(myLastFun)的返回值done
      console.log(result);  // myLastFun
    })
    function myFirstFun(callback) {
      callback(null,'one','two');
    }
    function mySecondFun(arg1,arg2,callback) {
      // arg1 相当于 'one' ,arg2 相当于 'two'
      callback(null,'three');
    }
    function myLastFun(arg1,callback) {
      // arg1 相当于 'three'
      callback(null,'done');
    }
    

    3.async.parallel:并行无关联

    task并行运行函数集合,而不必等到上一个函数完成。如果任何函数发生错误,会立刻执行回调函数,并返回错误信息;若没有发生错误,则会再所有tasks函数执行完毕之后用回掉函数将结果返回。

    语法:async.parallel(tasks,callback) 代码示例:

    async.parallel([
      function(callback) {
        setTimeout(function() {
          callback(null, 'one');
        }, 200);
      },
      function(callback) {
        setTimeout(function() {
          callback(null, 'two');
        }, 100);
      }
    ],function(err, results) {
      console.log(result)}
    );
    

    4.async.auto:智能控制

    以上都是纯串行传并行,但是当一个场景里,需要使用串行也需要使用并行的时候,虽然分别写能解决,但是效率不是很高,维护性也不是很好,auto可以解决这一问题。

    如下场景:

    • 从某处取得数据
    • 在硬盘上建立一个新的目录
    • 将数据写入到目录下某文件
    • 发送邮件,将文件以附件形式发送给其它人。
    • 可以知道1与2可以并行执行,3需要等1和2完成,4要等3完成。
    • 使用auto来解决
    var async = require('async');
    console.time('auto');
    async.auto({
      getData: function(callback) {
        setTimeout(function() {
          console.log('1.1: got data');
          callback(null, 'mydata');
        }, 300);
      },
      makeFolder: function(callback) {
        setTimeout(function() {
          console.log('1.1: made folder');
          callback(null, 'myfolder');
        }, 200);
      },
      writeFile: ['getData', 'makeFolder', function(callback) {
        setTimeout(function() {
          console.log('1.1: wrote file');
          callback(null, 'myfile');
        }, 300);
      }],
      emailFiles: ['writeFile', function(callback, results) {
        console.log('emailed file: ', results.writeFile);
        callback(null, results.writeFile);
      }]
    }, function(err, results) {
      console.log('err: ', err);
      console.log('results: ', results);
      console.timeEnd('auto');
    });
    
    

    结果如下

    1.1: made folder
    1.1: got data
    1.1: wrote file
    emailed file:  myfile
    err:  null
    results:  { makeFolder: 'myfolder',
      getData: 'mydata',
      writeFile: 'myfile',
      emailFiles: 'myfile'
    }
    auto: 650.972ms

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持北冥有鱼。

    您可能感兴趣的文章:

    • nodejs async异步常用函数总结(推荐)
    • NodeJs通过async/await处理异步的方法
    • async/await与promise(nodejs中的异步操作问题)

    广而告之:
    热门推荐:
    JavaScript异步上传图片文件的实例代码

    html: <form action="url" enctype="multipart/form-data" id="myform" method="post"> <input accept="image/*" id="addfile" type="file" /> </form> jquery: $("#addfile").on('change', function () { var f = $(this).get(0).files[0]; v···

    php中文件上传的安全问题

    可以读/etc/passwd! 这段。。 [文件上载] PHP自动支持基于RFC 1867的文件上载,我们看下面的例子: <FORM METHOD="POST" ENCTYPE="multipart/form-data"> <INPUT TYPE="FILE" NAME="hello"> <INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZ···

    DedeCMS 5.7 标签tag长度限制的修改方法

    大家都知道默认情况下,dedecms的标签tag长度是12个字节,也就是6个汉字,哪知道在织梦5.7中,也没有改掉这个烦恼的事,可能这个设定是基于效率问题考虑的,如果更新的时候设置的长度超过这个字符,系统就会不显示这个tag。有时候需要根据实际情况修改tag的长度,下面是方法···

    vue项目每30秒刷新1次接口的实现方法

    在vue.js项目中,经常需要对数据实时更新——每隔xx秒需要刷新一次接口——即需要用到定时器相关原理 我们先看一看2种常用定时器: setInterval(function(){}, milliseconds)——会不停的调用函数 setTimeout(function(){}, milliseconds)——只执行函数一次 乍看之下,setInterval会···

    js禁止表单重复提交

    本文实例为大家分享了js防止表单重复提交实现代码,供大家参考,具体内容如下 <DOCTYPE html> <html> <BODY BGCOLOR="#FFFFFF"> <form name='formsubmitf' id ="the" method="post" action="XXX.php"> <input type='hidden' name='mypre···

    bootstrap datepicker插件默认英文修改为中文

    datepicker插件默认为英文,而且格式为:mm/dd/yyyy这种情况,看起来不怎么直观。 修改目标: 1、默认显示为中文  2、格式为:yyyy年mm月dd日  需要修改两个地方: 1、更改datas对象, 增加zh-cn语言选项;参见源代码的1419行 var dates = $.fn.datepicker.dates = ···

    php运行提示:Fatal error Allowed memory size内存不足的解决方法

    本文实例讲述了php运行提示:Fatal error Allowed memory size内存不足的解决方法。分享给大家供大家参考。具体方法如下: 有些朋友新配置的环境或自己新写的程序运行时会碰到fatal error: Allowed memory size of 134217728 bytes exhausted错误,这种问题一个是程序写得不好导···

    vue的全局提示框组件实例代码

    这篇文章给大家介绍一个vue全局提示框组件,具体代码如下所示: <template> <!-- 全局提示框 --> <div v-show="visible" class="dialog-tips dialog-center"> <div>{{message}}</div> </div> </template> <script···

    PHP使用memcache缓存技术提高响应速度的方法

    本文实例讲述了PHP使用memcache缓存技术提高响应速度的方法。分享给大家供大家参考。具体分析如下: php虽然己经做到很好很快了,但是如果大数据量时还是会有些卡了,这里介绍一下PHP中使用memcache缓存技术提高响应速度方法,有需要了解的朋友可参考. memcache既可以在linux下使···

    手把手教你做超酷的条形码效果

    声明: 这篇文章教你在web页面上实现条形码效果,体现的是利用网页制作技术综合解决问题的思路。旨在使对HTML, JavaScript,PhotoShop具有入门级水平的人巩固入门级水平。 若有问题不能及时回复,麻烦请担待,不胜感激。 高手免进。 制作条形码总共分几步? ···