交流群:462197261站长百科站长论坛热门标签收藏本站北冥有鱼 互联网前沿资源第一站 助力全行业互联网+
点击这里给我发消息
  • 当前位置:
  • Nodejs异步流程框架async的方法

    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中的异步操作问题)

    广而告之:
    热门推荐:
    html标签a的target属性的用法

    1:如果使用标签<a>来链接到一个页面的话,target属性的作用,相信大家都知道。就是指对链接的页面以怎么样的形式展现出来,target常用的值有:_blank(以新弹出一个浏览器窗口打开链接的页面)、_self(在原来的窗口中打开链接的页面)。当然还有_top等等,因为不常用···

    JS实现的二叉树算法完整实例

    本文实例讲述了JS实现的二叉树算法。分享给大家供大家参考,具体如下: <!DOCTYPE HTML> <head> <title>20130328BinaryTree</title> <metahttp-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <html> ···

    php 错误处理经验分享

    本教程介绍了 PHP 中一些最为重要的错误检测方法。 我们将为您讲解不同的错误处理方法: 简单的 "die()" 语句 自定义错误和错误触发器 错误报告 基本的错误处理:使用 die() 函数 第一个例子展示了一个打开文本文件的简单脚本: 复制代码 代码如下: <?php $file=fop···

    项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)

    第一个项目终于上线了,是一个叫亲青筹的公益众筹平台,微信端,电脑端还有后台界面大部分都是我完成的,几个月过来,感觉收获了很多,觉得要总结一下。 首先想到的是图片上传的问题。在通常表单数据都是ajax上传的情况下,为了上传图片而去使用form表单感觉很蠢。然后那时候···

    入门知识 网站地址前的http是什么意思?

    HTTP是什么? 当我们想浏览一个网站的时候,只要在浏览器的地址栏里输入网站的地址就可以了,例如www.kunjuke.com,但是在浏览器的地址栏里面出现的却是:https://www.kunjuke.com ,你知道为什么会多出一个“http”吗? 一、HTTP协议是什么 我们在浏览器的地址栏里输入···

    了解html页面的渲染过程以备学习前端的性能优化(续)

    昨天晚上写了一篇关于浏览器的渲染过程的随笔,但只是通过一小段代码解释了一下,并没有通过浏览器测试,说服力不够,而且还有很多不完善的地方,今天在浏览器中测试了一下,并把测试的结果分享给大家,测试过程可能有点乱,希望大家理解。 测试浏览器:Chrome v24.0.1312.52 m···

    php 按指定元素值去除数组元素的实现方法

    按指定元素值去除数组元素 复制代码 代码如下: <?php //去除值为"Cat"的元素 $a=array("a"=>"Dog","b"=>"Cat","c"=>"Horse"); print_r($a); unset($a[array_search("Cat",$a)]);//array_search("Cat",$a)按元素值返回键名。去除后保持索引 print_r($a); ?>···

    Vue 页面状态保持页面间数据传输的一种方法(推荐)

    如果大家觉得有用,更多的模块请 点击查看 vue router给我们提供了两种页面间传递参数的方式: 动态路由匹配 编程式的导航 // 命名的路由 router.push({ name: 'user', params: { userId: 123 }}) // 带查询参数,变成 /register?plan=private router.push({ path: ···

    Python3+selenium配置常见报错解决方案

    第一个坑:'geckodriver' executable needs to be in PATH 1.如果启动浏览器过程中报如下错误 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "D:\test\python3\lib\site-packages\selenium\webdriver\firefox\webdriver.py", li···

    JS 数组随机洗牌的实例代码

    下面通过一段代码给大家介绍js 数组随机洗牌的方法,具体代码如下所示: //先定义一个某数值范围内的随机数 function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1) + min) } // 克隆数组方法 /** * 克隆数组 * @param {array} arr 原数组 ···