nodejs Async详解之二:工具类
Async中提供了几个工具类,给我们提供一些小便利:
memoize
unmemoize
log
dir
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详解之二:工具类的更多相关文章
- Notification详解(含工具类)
昨天一天只写了两篇文章,效率超低.追其原因呢,其实我一直在研究noti ...
- nodejs Async详解之三:集合操作
Async提供了很多针对集合的函数,可以简化我们对集合进行异步操作时的步骤.如下: forEach:对集合中每个元素进行异步操作 map:对集合中的每个元素通过异步操作得到另一个值,得到新的集合 fi ...
- html 08-HTML5详解(二)
08-HTML5详解(二) #本文主要内容 拖拽 历史 地理位置 全屏 #拖拽 如上图所示,我们可以拖拽博客园网站里的图片和超链接. 在HTML5的规范中,我们可以通过为元素增加 draggable= ...
- 【转】logback logback.xml常用配置详解(二)<appender>
原创文章,转载请指明出处:http://aub.iteye.com/blog/1101260, 尊重他人即尊重自己 详细整理了logback常用配置, 不是官网手册的翻译版,而是使用总结,旨在更快更透 ...
- Git 常用命令详解(二)
Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...
- 详解LUA开发工具及其环境配置
LUA开发工具及其环境配置是本文要介绍的内容,主要是来了解并学习lua开发工具的使用和环境的配置,第一次接触LUA的话,就跟本人一起学习吧.看我能不能忽悠到你. LUA是语言,那么一定有编写的工具.第 ...
- 【转】 Git 常用命令详解(二)----不错
原文网址:http://blog.csdn.net/ithomer/article/details/7529022 Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如: ...
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)
原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)
本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...
随机推荐
- SQL Server 2008 收缩日志(log)文件
USE TestDB; GO ALTER DATABASE TestDB SET RECOVERY SIMPLE; --设置简单恢复模式 GO ); GO ALTER DATABASE TestDB ...
- UGUI 的多分辨率适配
1.Canvas的属性配置 2.Canvas Scaler的属性配置 3.根据不同的屏幕的比例动态修改缩放基准 void Start () { float standard_width = 960f; ...
- Python 流程控制:for
for 循环用于对一个序列进行遍历,用法如下: In [4]: for i in 'abcd': ...: print(i) ...: a b c d In [13]: for i in range( ...
- nano100B的看门狗讲解
看门狗定时器的用途是在软件出问题时执行系统复位功能,这可以防止系统无限期地挂起.除此之外,看门狗定时器还支持将CPU 从掉电模式唤醒的功能.看门狗定时器包含一个18 位的自由运行计数器,定时溢出间隔可 ...
- iOS - UITableView滚动到指定的cell并且选中
UITableView //项目中遇到的 - (void)selectRowAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)a ...
- 解决wamp、vertrigo等集成环境安装后apache不能启动的问题
如果不是端口的问题,通常就是由于缺少vc库文件的支持,把vc2005.vc2008.vc2010抖安装一遍就呢过解决问题
- shell ln
功能:ln命令为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 ...
- 【Android N 7.1.1】 锁屏之上显示Toast
package com.android.systemuirom.keyguard; import android.content.Context; import android.view.Gravit ...
- [SCOI2008] 着色方案[高维dp]
321. [SCOI2008] 着色方案 ★★★ 输入文件:color.in 输出文件:color.out 简单对比时间限制:1 s 内存限制:64 MB 题目背景: 有n个木块排成一 ...
- hdu5009 Paint Pearls[指针优化dp]
Paint Pearls Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...