node.js中async的使用

async,node.js是一个流程控制库。

  1. async.series串行执行一组函数,第一个参数是一个由函数组成的数组或json,第二个参数是回调函数。回调函数里先执行task1的返回结果,再处理task2的。

task1一旦出错,task2不执行。依次输出task1,task2的result。

var async = require("async");
var fs = require("fs");
async.series([    //task1
	function(callback){
		  fs.readFile("test.txt",function(err,data){
		  	callback(err,data)
		  });
	},    //task2
		function(callback){
		  fs.readFile("test2.txt",function(err,data){
		  	callback(err,data)
		  });
	}
],function(err, results) {
    console.log(results.toString());
});

2.  async.waterfall和series函数有很多相似之处,都是按顺序依次执行一组函数,不同之处是waterfall每个函数产生的值,都将传给下一个函数,task1的result作为参数传给task2 。只输出task2的result

var async = require(‘async‘);
async.waterfall([    //task1
    function(callback){
      callback(‘test‘,1);
    },  //task2  function(data,callback){
      callback(null,2);
    }
],function(err,results){
    console.log(err); //test
});

  3. async.parallel函数是并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。 传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序

var async=require("async");
async.parallel([
    function(callback){
        setTimeout(function(){
            callback(null, ‘one‘)
        },5000);
    },
    function(callback){
        setTimeout(function(){
            callback(null, ‘two‘)
        },1000);
    }
],
function(err, results){
    console.log(results);// one  two
});

4. async.parallelLimit函数和parallel类似,但是它多了一个参数limit。 limit参数限制任务只能同时并发一定数量,而不是无限制并发

 var async=require("async");
async.parallelLimit([
    function(callback){
        setTimeout(function(){
            callback(null, ‘one‘);
        }, 1000);
    },
    function(callback){
        setTimeout(function(){
            callback(null, ‘two‘);
        }, 1000);
    }
],
1,//限制最多只能并行执行一个任务
function(err, results){
    console.log(results);//执行完耗时2s
});

5.async.whilst(test,fn,callback) 相当于while,用于循环执行一个函数,只有第一次执行完才会执行下一次,test参数是一个返回布尔值得函数,为真则循环继续。

var count = 0;
async.whilst(
    function () { return count < 5; },
    function (callback) {
        count++;
        setTimeout(callback, 1000);
    },
    function (err) {

    }
);

6 async.dowhilst(fn,test,callback) 相当于dowhile,也是用于循环,先执行函数,再进行判断,不BB,看例子

var count = 0;
async.doWhilst(
    function (callback) {
        count++;
        setTimeout(function(){  callback(null,1);}, 1000);
    },
    function () { return count < 5; },
    function (err) {

    }
);

7.async.forever(fn,callback) 跟它名字一样,fn一直循环执行,直到程序出现异常,例子中a=10时,停止循环

var a =0;
 async.forever(
    function(callback) {
     setTimeout(function(){
         console.log(a++);
         if(a==10){
             callback(‘err‘,0);
         }else{
             callback(null,1);
         }
     },1000)
    },
    function(err) {
       //
    }
);

8.async.compose(fn1,fn2,fn3...)可以创建一个异步函数的集合函数,将传入的多个异步函数包含在其中,当我们执行这个集合函数时,会依次执行每一个异步函数,返回值作为参数传给下个函数。我们可以使用compose把异步函数f、g、h,组合成f(g(h()))的形式,通过callback得到返回值

function fn1(n, callback) {
    setTimeout(function () {
        callback(null, n + 1);
    }, 1000);
}
function fn2(n, callback) {
    setTimeout(function () {
        callback(null, n * 3);
    }, 1000);
}
var demo = async.compose(fn2, fn1);//先执行fn1
demo(4, function (err, result) {
   console.log(result);//15
});

9. async.auto(tasks,[callback]) 用来处理有依赖关系的多个任务的执行,看官网的例子

async.auto({
    get_data: function(callback){
        console.log(‘in get_data‘);
        callback(null, ‘data‘, ‘converted to array‘);
    },
    make_folder: function(callback){
        console.log(‘in make_folder‘);
        callback(null, ‘folder‘);
    },
    write_file: [‘get_data‘, ‘make_folder‘, function(callback, results){
        console.log(‘in write_file‘, JSON.stringify(results));
        callback(null, ‘filename‘);
    }],
    email_link: [‘write_file‘, function(callback, results){
        console.log(‘in email_link‘, JSON.stringify(results));
     write_file.
        callback(null, {‘file‘:results.write_file, ‘email‘:‘[email protected]‘});
    }]
}, function(err, results) {
    console.log(‘err = ‘, err);
    console.log(‘results = ‘, results);
});

//执行结果
in get_data
in make_folder
in write_file {"get_data":["data","converted to array"],"make_folder":"folder"}
in email_link {"get_data":["data","converted to array"],"make_folder":"folder","write_file":"filename"}
err =  null
results =  { get_data: [ ‘data‘, ‘converted to array‘ ],
  make_folder: ‘folder‘,
  write_file: ‘filename‘,
  email_link: { file: ‘filename‘, email: ‘[email protected]‘ } }

8.async.queue(work,concurrency)和parallelLimit类似,多个点可供回调,如无等候任务时(empty)、全部执行完时(drain)等。

var q = async.queue(function(task, callback) {
    console.log(‘worker is processing task: ‘, task.name);
    callback();
}, 2);
q.push({name: ‘foo‘}, function (err) {
    console.log(‘finished processing foo‘);
});
q.push({name: ‘bar‘}, function (err) {
    console.log(‘finished processing bar‘);
});
//当最后一个任务交给worker执行时,会调用empty函数:
q.empty = function() {
    console.log(‘no more tasks wating‘);
}

9.async.iterator (tasks) 将一组函数包装成为一个iterator,可通过next()得到以下一个函数为起点的新的iterator。该函数通常由async在内部使用,但如果需要时,也可在我们的代码中使用它。

var iter = async.iterator([
    function() { console.log(‘111‘)},
    function() { console.log(‘222‘) },
    function() { console.log(‘333‘) }
]);
var iter2 = iter();//111
var aa = iter2.next();
aa();//333

10. async.apply() 可以让我们给一个函数预绑定多个参数并生成一个可直接调用的新函数

var test = function(n, callback, timeout) {
    timeout = timeout || 200;
    setTimeout(function() {
        callback(null, n+1);
    }, timeout);
};

var x = async.apply(test , 1);
x(function(err, n){
    console.log(n);
});
async.parallel([
    async.apply(fn1, 3),
    async.apply(fn2, 100)
], function (err, results) {
    log(‘err: ‘, err);
    log(‘results: ‘, results);
});
时间: 2024-09-30 15:30:38

node.js中async的使用的相关文章

Node.js中流程控制

Node.js中的流程控制可以使用async,在使用之前需要先安装,使用npm安装 npm install async --g 下面主要介绍4种流程控制的方式: 1.串行无关联:async.series(tasks,callback) 多个函数依次执行,之间没有数据交换,其中一个函数出错,后续函数不再执行; 以下是标准写法: async.series({ one: function(callback){ callback(null, 1); }, two: function(callback){

在Node.js中使用RabbitMQ系列二 任务队列

在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心解决的问题是避免立即处理那些耗时的任务,也就是避免请求-响应的这种同步模式.取而代之的是我们通过调度算法,让这些耗时的任务之后再执行,也就是采用异步的模式.我们需要将一条消息封装成一个任务,并且将它添加到任务队列里面.后台会运行多个工作进程(worker process),通过调度算法,将队列里的任

Node.js权威指南 (10) - Node.js中的错误处理与断言处理

10.1 使用domain模块处理错误 / 272 10.1.1 domain模块概述 / 272 10.1.2 创建并使用Domain对象 / 274 10.1.3 隐式绑定与显式绑定 / 276 10.1.4 绑定回调函数与拦截回调函数 / 279 10.1.5 domain堆栈的弹出与推入 / 280 10.1.6 Domain对象的销毁 / 28610.2 Node.js中的断言处理 / 286 10.2.1 equal方法与notEqual方法 / 287 10.2.2 strictE

node.js中的交互式运行环境-REPL

<Node.js权威指南>第2章Node.js中的交互式运行环境--REPL 开发者可以在该环境中很方便地输入各种JavaScript表达式并观察表达式的运行结果. 在学习Node.js框架的过程中,通过该运行环境的使用,我们可以很方便地了解Node.js中定义的各种对象所拥有的各种属性及方法.本节为大家介绍在REPL运行环境中操作变量 2.2 在REPL运行环境中操作变量 在REPL运行环境中,可以使用var关键字来定义一个变量并为其赋值,但是在输入了对其赋值进行的表达式后,该表达式的执行结

node.js中的exports和module.exports

不同的编程语言都有各自的代码组织和复用的方式,如.net.php中的命名空间,python中的import,ruby中的module等,来避免命名空间污染.一直都没搞清楚node中的exports和module.exports的区别,借此搞清楚node的代码模块复用方式. 首先怎么创建node中的modules. 可以直接创建一个文件作为module,如下module.js function writeLine(){ console.log("module.js"); } export

在node.js中使用COOKIE

node.js中如何向客户端发送COOKIE呢?有如下两个方案: 一.使用response.writeHead,代码示例: //设置过期时间为一分钟 1 var today = new Date(); 2 var time = today.getTime() + 60*1000; 3 var time2 = new Date(time); 4 var timeObj = time2.toGMTString(); 5 response.writeHead({ 6 'Set-Cookie':'myC

setTimeout函数在浏览器中和Node.js中的区别

setTimeout函数delay时间之后执行一次func. setTimeout函数原型: var timeoutID = window.setTimeout(func, [delay, param1, param2, ...]); var timeoutID = window.setTimeout(code, [delay]);//not recommended for the same reasons as using eval() //param1, param2, and so for

log4js-Node.js中的日志管理模块使用与封装

开发过程中,日志记录是必不可少的事情,尤其是生产系统中经常无法调试,因此日志就成了重要的调试信息来源. Node.js,已经有现成的开源日志模块,就是log4js,源码地址:点击打开链接 项目引用方法: npm install log4js 1.配置说明(仅以常用的dateFile日志类型举例,更多说明参考log4js-wiki): { "appenders": [ // 下面一行应该是用于跟express配合输出web请求url日志的 {"type": "

笔记-Node.js中的核心API之HTTP

最近正在学习Node,在图书馆借了基本关于Node的书,同时在网上查阅资料,颇有收获,但是整体感觉对Node的理解还是停留在一个很模棱两可的状态.比如Node中的模块,平时练习就接触到那么几个,其他的一些模块暂时只会在学习的时候接触到,不常用便就荒废了.正所谓好记心不如烂笔头,多做笔记还是更有利于理解和记忆.自己做的总结也方便回头复习,所以决定踏上漫长的修炼之旅-- Node提供了许多API,其中一些比较重要.这些核心的API是所有Node应用的支柱,你会不停的用到他们. HTTP服务器 Nod