Async中提供了几个工具类,给我们提供一些小便利:

  1. memoize

  2. unmemoize

  3. log

  4. dir

  5. noConflict

1. memoize(fn, [hasher])

有一些方法比较耗时,且对于相同的输入总是有相同的输出。这时可以使用memoize给它加个缓存,对于相同的参数只计算一次,以后就直接从缓存中取结果用了。

比如这里有一个很慢的函数:

var slow_fn = function(x, y, callback) { 
    console.log(‘start working for: ‘ + x+’,'+y); 
    t.wait(100); 
    console.log(‘finished: ‘ + x+’,'+y); 
    callback(null, ‘im slow for: ‘+x+’,'+y); 
};

可以用memoize生成一个新的带缓存的函数:

var fn = async.memoize(slow_fn);

试试同样参数调用两次:

fn(‘a’,'b’, function(err, result) { 
    console.log(result); 
});

// 直接得到之前计算好的值 
fn(‘a’,'b’, function(err, result) { 
    console.log(result); 
});

注意memoize的参数中还有一个hasher,它是做什么用的呢?它可以让我们自定义如果根据参数来判断是否从缓存中取。默认情况下,两次调用,只有参数完全一样的时候才会从缓存中取。这里我们使用hasher来改变规则。

var fn_hasher = async.memoize(slow_fn, function(x,y) { 
    return x+y; 
});

新定义的这个,将根据两个参数的和来判断。

fn_hasher(‘cd’,'e’, function(err, result) { 
    console.log(result); 
});

fn_hasher(‘c’,'de’, function(err, result) { 
    console.log(result); // 可以取得前面(‘cd’,'e’)的计算结果 
                         // im show for: cd,e 
});

第二次的调用,虽然参数跟第一次不一样,但是其和却一样,所以直接从缓存中拿到前次运行结果。

2. unmemoize(fn)

unmemoize的作用正好跟memoize相反,它可以把一个带缓存的函数再变回原样:

var fn2 = async.unmemoize(fn); 
console.log(‘unmemoized’);

fn2(‘a’,'b’, function(err,result) { 
    console.log(result); 
});

经过unmemoize后,再运行该函数就得重新运算了。

3. log(function, arguments)

log用于快速执行某异步函数,并记录它的返回值。试验函数时很方便,不用写那些固定模式的代码。

var x = function() { 
    this.name = ‘Freewind’; 
} 
var hello = function(name, callback) { 
    setTimeout(function() { 
        callback(null, ‘hello ‘ + name, ‘nice to see you ‘ + name, x, {a:’123′}); 
    }, 200); 
};

async.log(hello, ‘world’);

打印结果如下:

hello world 
nice to see you world 
[Function] 
{ a: ’123′ }

可以看到,它直接运行了该函数,并以每行一个参数的形式打印出了结果。

4. dir(function, arguments)

该函数与log非常像,不同之处在于,它最终调用了console.dir,而log最终调用了console.log。

看看使用dir打印的效果如何:

async.dir(hello, ‘world’);

结果:

‘hello world’ 
‘nice to see you world’ 
[Function] 
{ a: ’123′ }

仅仅是多了几个单引号。为了弄清楚dir存在的意义(什么情况下应该使用dir而不是log),我提了一个问题,参看:<a title="http://stackoverflow.com/questio ... c-log-and-async-dir" href="http://stackoverflow.com/questions/10636866/whats-the-difference-between-async-log-and-async-dir"> http://stackoverflow.com/questio ... c-log-and-async-dir

5. noConflict

最后是这个noConflict,它仅仅用于浏览器端,在nodejs中没用,这里无法演示。

它的作用是:如果之前已经在全局域中定义了async变量,当导入本async.js时,会先把之前的async变量保存起来,然后覆盖它。用完之后,调用noConflict()方法,就会归还该值。同时返回async本身供换名使用。

这里可以看一下它的实现代码:

// global on the server, window in the browser 
var root = this, 
    previous_async = root.async;

if (typeof module !== ‘undefined’ && module.exports) { 
    module.exports = async; 
} 
else { 
    root.async = async; 
}

async.noConflict = function () { 
    root.async = previous_async; 
    return async; 
};

可以看到,当处于nodejs或者commonjs环境中,它会执行module.exports=async,在其它情况下(通常为浏览器端)才会root.async=async,将async赋值给root。

在浏览器中的用法如下:

<script type="text/javascript" src="other_lib.js"></script> 
<script type="text/javascript" src="async.js"></script> 
<script type="text/javascript">

// code using async 
  async.noConflict(); 
  // Code that uses other library’s ‘async’ can follow here. 
</script>

nodejs Async详解之二:工具类的更多相关文章

  1. Notification详解(含工具类)

                                                                     昨天一天只写了两篇文章,效率超低.追其原因呢,其实我一直在研究noti ...

  2. nodejs Async详解之三:集合操作

    Async提供了很多针对集合的函数,可以简化我们对集合进行异步操作时的步骤.如下: forEach:对集合中每个元素进行异步操作 map:对集合中的每个元素通过异步操作得到另一个值,得到新的集合 fi ...

  3. html 08-HTML5详解(二)

    08-HTML5详解(二) #本文主要内容 拖拽 历史 地理位置 全屏 #拖拽 如上图所示,我们可以拖拽博客园网站里的图片和超链接. 在HTML5的规范中,我们可以通过为元素增加 draggable= ...

  4. 【转】logback logback.xml常用配置详解(二)<appender>

    原创文章,转载请指明出处:http://aub.iteye.com/blog/1101260, 尊重他人即尊重自己 详细整理了logback常用配置, 不是官网手册的翻译版,而是使用总结,旨在更快更透 ...

  5. Git 常用命令详解(二)

    Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...

  6. 详解LUA开发工具及其环境配置

    LUA开发工具及其环境配置是本文要介绍的内容,主要是来了解并学习lua开发工具的使用和环境的配置,第一次接触LUA的话,就跟本人一起学习吧.看我能不能忽悠到你. LUA是语言,那么一定有编写的工具.第 ...

  7. 【转】 Git 常用命令详解(二)----不错

    原文网址:http://blog.csdn.net/ithomer/article/details/7529022 Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如: ...

  8. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

  9. iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

    本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...

随机推荐

  1. oracle解决多表关联分组查询问题

    做了一个功能需要分组查询,同时查询A表分组查询的ID需要关联B表的数据,本来想两个表关联查询,但是报group by 语法不正确.所以做了以下修改. select count(*), cindexid ...

  2. 第五章 面向方面编程___AOP入门

    上一篇讲了 AOP 和 OOP 的区别,这一次我们开始入门 AOP .实现面向方面编程的技术,主要分为两大类: 一是 采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行: ...

  3. 使用rlwrap调用sqlplus中历史命令

    此文来自http://www.cnblogs.com/mchina/archive/2013/03/08/2934473.html 在此谢谢原创作者. 在Linux中运行SQL*Plus,不能调用历史 ...

  4. sphinx的配置和管理.No2

    网上配置文档众多,但是对着他们的文档来做老是出问题,于是花了点时间研究了一下,写成总结,方便以后查阅.也希望学习sphinx的朋友能少走弯路.Coreseek的安装请参考:http://blog.ch ...

  5. ios错误大全

    /读取数据库数据 -(void)movethesqlitefile{ NSString *sourcepath=[[NSBundle mainBundle]pathForResource:@" ...

  6. ajax响应报文可以被浏览器缓存的必要条件

    1.发送请求时必须使用get方法. 2.服务器端设置响应报文的Expires为希望浏览器缓存的时间 如果这两个条件都不满足时,也就是说无法通过浏览器缓存来缓存文件时: 在js中设置一个localCac ...

  7. 【BZOJ2118】墨墨的等式 最短路

    [BZOJ2118]墨墨的等式 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值 ...

  8. iOS使用位置和方向服务(来自苹果apple官方)

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   本文章来自苹果官方文档,特此声明--------禚 Core Location框架为定位用户当前位置和方向(Headin ...

  9. BFS+优先队列+状态压缩DP+TSP

    http://acm.hdu.edu.cn/showproblem.php?pid=4568 Hunter Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  10. vector库的用法

    C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...