Async中提供了几个工具类,给咱们提供一些小便利:javascript
memoizejava
unmemoizenode
log浏览器
dir缓存
noConflict异步
1. memoize(fn, [hasher])async
有一些方法比较耗时,且对于相同的输入老是有相同的输出。这时可使用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);
};this
能够用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>