nodejs Async詳解之二:工具類

Async中提供了幾個工具類,給咱們提供一些小便利:javascript

  1. memoizejava

  2. unmemoizenode

  3. log瀏覽器

  4. dir緩存

  5. 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>

相關文章
相關標籤/搜索