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>