深入学习nodejs中的async模块的使用方法

最近在学习nodejs,这两天学习了async模块这个地方知识点挺多的,所以,今天添加一点小笔记。

async模块是为了解决嵌套金字塔,和异步流程控制而生.常用的方法介绍

npm 安装好async模块,然后引入就可以使用 var async = require('async');

1. series(tasks,[callback])

多个函数从上到下依次执行,相互之间没有数据交互

var task1 =function(callback){ 

 console.log("task1");
 callback(null,"task1")
} 

var task2 =function(callback){ 

 console.log("task2");
 callback(null,"task2")
} 

var task3 =function(callback){ 

 console.log("task3");
 callback(null,"task3")
} 

async.series([task1,task2,task3],function(err,result){ 

 console.log("series"); 

 if (err) {
 console.log(err);
 } 

 console.log(result);
})

运行结果:

如果中途发生错误,则将错误传递到回调函数,并停止执行后面的函数

var task1 =function(callback){ 

 console.log("task1");
 callback(null,"task1")
} 

var task2 =function(callback){ 

 console.log("task2");
 callback("err","task2")
} 

var task3 =function(callback){ 

 console.log("task3");
 callback(null,"task3")
} 

async.series([task1,task2,task3],function(err,result){ 

 console.log("series"); 

 if (err) {
 console.log(err);
 } 

 console.log(result);
})

运行结果:

2.parallel(tasks,[callback])

多个函数并行执行,不会等待其他函数

var task1 =function(callback){ 

 console.log("task1");
 setTimeout(function(){
 callback(null,"task1")
 },5000); 

} 

var task2 =function(callback){ 

 console.log("task2"); 

 setTimeout(function(){
 callback(null,"task2")
 },1000);
} 

var task3 =function(callback){ 

 console.log("task3");
 setTimeout(function(){
 callback(null,"task3")
 },3000);
}
console.time("parallel方法");
async.parallel([task1,task2,task3],function(err,result){ 

 console.log("parallel"); 

 if (err) {
 console.log(err);
 } 

 console.log(result);
 console.timeEnd("parallel方法");
})

运行结果:

3个函数分别延迟5000ms,1000ms,3000ms 结果5000ms就执行完毕.

如果中途出错,则立即将err和值传到最终的回调函数,其他未执行完毕的函数将不再执行,但是要占一个位置

var task1 =function(callback){ 

 console.log("task1");
 setTimeout(function(){
 callback(null,"task1")
 },5000); 

} 

var task2 =function(callback){ 

 console.log("task2"); 

 setTimeout(function(){
 callback("errmessage","task2")
 },3000);
} 

var task3 =function(callback){ 

 console.log("task3");
 setTimeout(function(){
 callback(null,"task3")
 },1000);
}
console.time("parallel方法");
async.parallel([task1,task2,task3],function(err,result){ 

 console.log("parallel"); 

 if (err) {
 console.log(err);
 } 

 console.log(result);
 console.timeEnd("parallel方法");
})

运行结果:

3.waterfall(tasks,[callback]) :瀑布流

依次执行,前一个函数的输出为后一个函数的输入

var task1 =function(callback){ 

 console.log("task1");
 callback(null,"11") 

} 

var task2 =function(q,callback){ 

 console.log("task2");
 console.log("task1函数传入的值: "+q);
 callback(null,"22")
} 

var task3 =function(q,callback){ 

 console.log("task3");
 console.log("task2函数传入的值: "+q);
 callback(null,"33")
}
console.time("waterfall方法");
async.waterfall([task1,task2,task3],function(err,result){ 

 console.log("waterfall"); 

 if (err) {
 console.log(err);
 } 

 console.log("result : "+result);
 console.timeEnd("waterfall方法");
})

执行结果:

如果中途出现错误,后面的函数将不在执行,之前执行的结果和错误信息将直接传到最终的回调函数

var task1 =function(callback){ 

 console.log("task1");
 callback(null,"11") 

} 

var task2 =function(q,callback){ 

 console.log("task2");
 console.log("task1函数传入的值: "+q);
 callback("errmessage","22")
} 

var task3 =function(q,callback){ 

 console.log("task3");
 console.log("task2函数传入的值: "+q);
 callback(null,"33")
}
console.time("waterfall方法");
async.waterfall([task1,task2,task3],function(err,result){ 

 console.log("waterfall"); 

 if (err) {
 console.log(err);
 } 

 console.log("result : "+result);
 console.timeEnd("waterfall方法");
})

运行结果:

4.parallelLimit(tasks,limit,[callback])

和parallel类似,只是limit参数限制了同时并发执行的个数,不再是无限并发

var task1 =function(callback){ 

 console.log("task1");
 setTimeout(function(){
 callback(null,"task1")
 },5000); 

} 

var task2 =function(callback){ 

 console.log("task2"); 

 setTimeout(function(){
 callback(null,"task2")
 },3000);
} 

var task3 =function(callback){ 

 console.log("task3");
 setTimeout(function(){
 callback(null,"task3")
 },4000);
}
console.time("parallelLimit方法");
async.parallelLimit([task1,task2,task3], 2, function(err,result){ 

 console.log("parallelLimit"); 

 if (err) {
 console.log(err);
 } 

 console.log(result);
 console.timeEnd("parallelLimit方法");
})

运行结果:

三个函数分别是延迟5000ms,3000ms,4000ms结果执行时间为什么是7000ms呢

因为首先执行函数1和2,

3秒后函数2执行完毕,这个时候函数3开始执行,

5秒后函数1执行完毕,函数3还有2秒,

7秒后函数3执行完毕.

5.auto(tasks,[callback])

多个函数有数据交互,有的并行,有的依次执行

console.time("auto方法");
async.auto({
 task1: function(callback){
 console.log("tsak1");
 setTimeout(function(){
 callback(null, 'task11', 'task12');
 },2000);
 },
 task2: function(callback){
 console.log('task2');
 setTimeout(function(){
 callback(null, 'task2');
 },3000);
 },
 task3: ['task1', 'task2', function(callback, results){
 console.log('task3');
 console.log('task1和task2运行结果: ',results);
 setTimeout(function(){
 callback(null, 'task3');
 },1000);
 }],
 task4: ['task3', function(callback, results){
 console.log('task4');
 console.log('task1,task2,task3运行结果: ',results);
 setTimeout(function(){
 callback(null, {'task41':results.task3, 'task42':'task42'});
 },1000);
 }]
}, function(err, results) {
 console.log('err :', err);
 console.log('最终results : ', results);
 console.timeEnd("auto方法");
});

运行结果:

5秒运行完毕,

函数1和2并行,3秒执行完毕,

函数1和2执行完毕后,函数3,4依次执行共计5秒.

6.whilst(test,fn,[callback])

相当于while循环,fn函数里不管是同步还是异步都会执行完上一次循环才会执行下一次循环,对异步循环很有帮助,
test是条件,为true时执行fn里的方法

var datalist = [{number:10},{number:20},{number:30},{number:40},{number:50}];
var count = 0; 

var test = function () {
 return count<datalist.length;
}; 

var fn = function(callback){
 console.log(datalist[count].number);
 setTimeout(function () {
 count++;
 callback();
 },1000)
}; 

async.whilst(test,fn,function(err){
 if(err){
 console.log(err);
 }
 console.log('whilst结束');
});

运行结果:

7.doWhilst

和whilst类似,和do-while一个意思,首先执行一次fn,再判断,和whilst相比它把fn和test位置交换了而已.

until和whilst相反,当test判断为false的时候执行fn里的方法,为true时跳出,

doUntil与doWhilst相反.

8.forever(fn,errback)

forever就是无限循环了.只有当中途出现错误的时候才会停止

var count = 0;
async.forever(function(callback){
 console.log(count);
 count++; 

 if (count>10) {
 callback("errmessage");
 return;
 } 

 setTimeout(function () {
 callback();
 },1000)
},
function(err){
 console.log(err);
});

运行结果:

9.compose(fn1,fn2,fn3...)

这个方法会创建一个异步的集合函数,执行的顺序是倒序.前一个fn的输出是后一个fn的输入.有数据交互

var task1 =function(m,callback){ 

 console.log("task1");
 setTimeout(function(){
 callback(null,m*2)
 },1000); 

} 

var task2 =function(m,callback){ 

 console.log("task2"); 

 setTimeout(function(){
 callback(null,m+3)
 },1000);
} 

var task3 =function(m,callback){ 

 console.log("task3");
 setTimeout(function(){
 callback(null,m*5)
 },1000);
}
console.time("compose方法"); 

var com = async.compose(task3,task2,task1); 

com(2,function(err,result){
 if (err) {
 console.log(err);
 }
 console.log(result);
 console.timeEnd("compose方法");
})

运行结果:

相当于 var m=2; (m*2+3)*5 =35;

在我的项目开发中waterfall用的最多.

更多方法详情 : https://www.npmjs.com/package/async

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

(0)

相关推荐

  • Nodejs中使用captchapng模块生成图片验证码

    Nodejs项目,在做图片验证码的时候遇到了难题.Nodejs没有图片库,以后会有,但是现在没有. 网络上搜索一圈,有几个解决方案: 1.采用第三方验证码程序,有的时候,项目可能不允许: 2.使用Java或者PHP生成图片,Nodejs调用,中间采用Redies共享: 这两种方式都不太理想,好在终于找到了可以支持Nodejs图片验证码的一个库,虽然只支持数字,但是也还不错.原理是使用Base64的图片编码方式. 这个库的Gighub地址是:https://github.com/GeorgeCha

  • 在 Node.js 中使用原生 ES 模块方法解析

    从版本 8.5.0 开始,Node.js 开始支持原生 ES 模块,可以通过命令行选项打开该功能.新功能很大程度上得归功于 Bradley Farias. 1.演示 这个示例的代码目录结构如下: esm-demo/ lib.mjs main.mjs lib.mjs: export function add(x, y) { return x + y; } main.mjs: import {add} from './lib.mjs'; console.log('Result: '+add(2, 3

  • NodeJS 实现手机短信验证模块阿里大于功能

    1,NodeJS 安装阿里大于模块 切换到项目目录使用npm 安装阿里于模块 npm i node-alidayu --save 2,aliyu官网使用淘宝账户登录 登录阿里大于 https://doc.alidayu.com/doc2/index.htm 1登录后点击管理中心 2点击应用管理===>创建应用 3配置管理===>验证码====>里添加短信签名 4应用列表里===>操作一栏===>点击设置    记住 app   key 和 APP  sercret 5.后台代

  • nodejs入门教程六:express模块用法示例

    本文实例讲述了nodejs入门教程之express模块用法.分享给大家供大家参考,具体如下: /** * Created by Dason on 2017/3/28. */ var express = require('express'); var morgan = require('morgan');//打印日志的中间件 //创建express 的实例 var app = express(); /** * 中间件: * Connect: Node.js的中间件框架 * 分层处理:每层实现一个功

  • 实例分析nodejs模块xml2js解析xml过程中遇到的坑

    本文实例讲述了nodejs模块xml2js解析xml过程中遇到的坑.分享给大家供大家参考,具体如下: 在一个项目中,用到nodejs模块xml2js解析xml,xml的数据如下: <xml> <MsgId>6197906553041859764</MsgId> </xml> 用xml2js中的xml2js.parseString 方法解析,本来以为是一个json,但总是解析失败,把解析的结果log下后如下: { xml: { MsgId: [ '619790

  • Nodejs读取文件时相对路径的正确写法(使用fs模块)

    在开发Nodejs中,我们往往最常用的模块就是fs核心模块(fs.readFile)来读取文件.代码如下: 但是运行之后,并没有按照想象中一样,读取test.html文件内容,这是一个bug,坑爹的玩意,解决办法: 其实由于运行环境的不同,以上的相对路径的写法导致最后读取的位置是不同的. 正确的写法应该是使用"path.join()"的方式实现:(__dirname表示当前文件的目录名) //require 表示引包,引包就是引用自己的一个特殊功能 var http = require

  • 深入学习nodejs中的async模块的使用方法

    最近在学习nodejs,这两天学习了async模块这个地方知识点挺多的,所以,今天添加一点小笔记. async模块是为了解决嵌套金字塔,和异步流程控制而生.常用的方法介绍 npm 安装好async模块,然后引入就可以使用 var async = require('async'); 1. series(tasks,[callback]) 多个函数从上到下依次执行,相互之间没有数据交互 var task1 =function(callback){ console.log("task1");

  • 使用Python中的tkinter模块作图的方法

    python简述: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.Python[1]已经成为最受欢迎的程序设计语言之一.2011年1月,它被TIOBE编程语言排行榜评为2010年度语言.自从2004年以后,python的使用率是呈线性增长. tkinter模块介绍 tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以

  • node.js中fs文件系统模块的使用方法实例详解

    本文实例讲述了node.js中fs文件系统模块的使用方法.分享给大家供大家参考,具体如下: node.js中为我们提供了fs文件系统模块,实现对文件或目录的创建,修改和删除等操作. fs模块中,所有的方法分为同步和异步两种实现. 有 sync 后缀的方法为同步方法,没有 sync 后缀的方法为异步方法. 一.文件的整个读取 const fs = require('fs'); //参数一表示读取的文件 //参数二表示读取的配置,{encoding:'null', flag:'r'} //encod

  • node.js中path路径模块的使用方法实例分析

    本文实例讲述了node.js中path路径模块的使用方法.分享给大家供大家参考,具体如下: path模块是node.js中处理路径的核心模块.可以很方便的处理关于文件路径的问题. join() 将多个参数值合并成一个路径 const path = require('path'); console.log(path.join('./a', 'b', 'c')); basename() 获取路径中的文件名 const path = require('path'); //获取文件名,包含扩展名 con

  • 使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解

    fs概述 文件 I/O 是由简单封装的标准 POSIX 函数提供的. nodeJS中通过 require('fs') 使用fs模块. 所有的方法都有异步和同步的形式. 异步形式始终以完成回调作为它最后一个参数. 传给完成回调的参数取决于具体方法,但第一个参数总是留给异常. 如果操作成功完成,则第一个参数会是 null 或 undefined //异步示例 var fs = require('fs'); fs.unlink('/tmp/hello', function(err){ if (err)

  • NodeJs中的VM模块详解

    什么是VM? VM模块是NodeJS里面的核心模块,支撑了require方法和NodeJS的运行机制,我们有些时候可能也要用到VM模板来做一些特殊的事情. 通过VM,JS可以被编译后立即执行或者编译保存下来稍后执行(JavaScript code can be compiled and run immediately or compiled, saved, and run later.) VM模块包含了三个常用的方法,用于创建独立运行的沙箱体制,如下三个方法 vm.runInThisContex

  • React中的axios模块及使用方法

    目录 1 axios介绍 2 使用方法 2.1 在React中安装axios 2.2 get请求 2.3 post请求:发送表单数据和文件上传 2.4 put请求:对数据进行全部更新 2.5 patch请求:只对更改过的数据进行更新 2.6 delete请求:删除请求(参数可以放在url上,也可以和post一样放在请求体中) 1 axios介绍 axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.它可以提供以下服务:1.从浏览器中创建XMLHttpRe

  • Nodejs中解决cluster模块的多进程如何共享数据问题

    前述 nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核CPU机器上的性能表现.本文将介绍利用cluster模块创建的多线程如何共享数据的问题. 进程间数据共享 首先举个简单的例子,代码如下: var cluster = require('cluster'); var data = 0;//这里定义数据不会被所有进程共享,各个进程有各自的内存区域 if (cluster.isMaster) { //主进程

  • nodejs中的http模块与npm模块使用

    目录 http模块 创建服务器基本步骤 request对象详解 response对象详解 实现静态WEB服务器 服务器响应首页 根据根据不同url,响应不同文件 静态资源的通用处理 npm - Node包管理工具 npm的基本概念 npm基本使用 package.json文件 本地安装和全局安装 http模块 创建服务器基本步骤 //1. 导入http模块,http模块是node的核心模块,作用是用来创建http服务器的. var http = require("http");   /

随机推荐