nodejs Async詳解之二 工具類

2022-01-16 06:01:32 字數 2736 閱讀 9801

async中提供了幾個工具類,給我們提供一些小便利:

memoize

unmemoize

logdir

noconflict

1. memoize(fn, [hasher])

有一些方法比較耗時,且對於相同的輸入總是有相同的輸出。這時可以使用memoize給它加個快取,對於相同的引數只計算一次,以後就直接從快取中取結果用了。

比如這裡有乙個很慢的函式:

var slow_fn = function(x, y, callback) ;

可以用memoize生成乙個新的帶快取的函式:

var fn = async.memoize(slow_fn);

試試同樣引數呼叫兩次:

fn(『a』,'b』, function(err, result) );

// 直接得到之前計算好的值 

fn(『a』,'b』, function(err, result) ); 

注意memoize的引數中還有乙個hasher,它是做什麼用的呢?它可以讓我們自定義如果根據引數來判斷是否從快取中取。預設情況下,兩次呼叫,只有引數完全一樣的時候才會從快取中取。這裡我們使用hasher來改變規則。

var fn_hasher = async.memoize(slow_fn, function(x,y) ); 

新定義的這個,將根據兩個引數的和來判斷。

fn_hasher(『cd』,'e』, function(err, result) );

fn_hasher(『c』,'de』, function(err, result) ); 

第二次的呼叫,雖然引數跟第一次不一樣,但是其和卻一樣,所以直接從快取中拿到前次執行結果。

2. unmemoize(fn)

unmemoize的作用正好跟memoize相反,它可以把乙個帶快取的函式再變回原樣:

var fn2 = async.unmemoize(fn); 

console.log(『unmemoized』);

fn2(『a』,'b』, function(err,result) ); 

經過unmemoize後,再執行該函式就得重新運算了。

3. log(function, arguments)

log用於快速執行某非同步函式,並記錄它的返回值。試驗函式時很方便,不用寫那些固定模式的**。

var x = function()  

var hello = function(name, callback) ); 

}, 200); 

};async.log(hello, 『world』);

列印結果如下:

hello world 

nice to see you world 

[function] 

可以看到,它直接執行了該函式,並以每行乙個引數的形式列印出了結果。

4. dir(function, arguments)

該函式與log非常像,不同之處在於,它最終呼叫了console.dir,而log最終呼叫了console.log。

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

async.dir(hello, 『world』);

結果:

『hello world』 

『nice to see you world』 

[function] 

僅僅是多了幾個單引號。為了弄清楚dir存在的意義(什麼情況下應該使用dir而不是log),我提了乙個問題,參看: ... c-log-and-async-dir" href="ns/10636866/whats-the-difference-between-async-log-and-async-dir">  ... 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)  

else

async.noconflict = function () ;

可以看到,當處於nodejs或者commonjs環境中,它會執行module.exports=async,在其它情況下(通常為瀏覽器端)才會root.async=async,將async賦值給root。

在瀏覽器中的用法如下:

Git詳解之二 Git基礎3

除了定製輸出格式的選項之外,git log還有許多非常實用的限制輸出長度的選項,也就是只輸出部分提交資訊。之前我們已經看到過 2了,它只顯示最近的兩條提交,實際上,這是 選項的寫法,其中的n可以是任何自然數,表示僅顯示最近的若干條提交。不過實踐中我們是不太用這個選項的,git 在輸出所有提交時會自動...

Threejs之二 相機詳解

所謂透視投影相機 perspectivecamera 基本等同於人的眼睛,意思就是 離的遠的物體會顯得比較小,近處的物體會比較大.透視投影相機的建構函式 perspectivecamera fov,aspect,near,far 複製 根據上圖來理解透視投影相機的4個引數 for 我理解為眼睛睜開的...

SpringMvc之引數繫結註解詳解之二

cousumes的樣例 1 controller 3 public voidaddpet requestbody pet pet,model model produces的樣例 1 controller 3 responsebody 4 publicpet getpet pathvariable s...