2013-02-16 69 views
0

我發現這個代碼混淆的地方說,我可以運行一些數據庫查詢異步與node.js的代碼

var queries = []; 


for (var i=0;i <1; i++) { 
    queries.push((function(j){ 
    return function(callback) { 
     collection.find(
    {value:"1"}, 

    function(err_positive, result_positive) { 
     result_positive.count(function(err, count){ 
     console.log("Total matches: " + count); 
     positives[j] = count;   
     callback(); 
     }); 
    } 

    ); 
    } 
    })(i)); 
} 

async.parallel(queries, function(){ 
    // do the work with the results 
} 

我沒有得到這個角色什麼是回調函數是如何如何界定?第二次在queries.push,它傳遞函數(J)什麼是法官在這一點,這是什麼(i)對於

queries.push((function(j){})(i)); 

我完全糊塗瞭如何代碼工作?

回答

1

環路準備的幾乎相同的功能的陣列作爲tasksasync.parallel()

循環後,給它只有一次迭代目前,queries將類似於:

var queries = [ 
    function (callback) { 
     collection.find(
      // etc. 
     ); 
    } 
]; 

而且,每增加一次迭代,新function (callback) { ... }將增加。

什麼是回調函數是如何定義的?

callback只是每個函數的命名參數。其值將由async.parallel()定義爲另一個function,該值在被調用時允許async知道每個任務何時完成。

秒查詢。推,它傳遞函數(J)什麼是法官在這一點,這是什麼(i)對於

queries.push((function(j){})(i)); 

(function(j){})(i)Immediately-Invoked Function Expression (IIFE)j作爲命名的參數,它與i一個馬上打電話傳遞的參數,並返回一個新function (callback) {}push編到queries

queries.push(
    (function (j) { 
     return function (callback) { 
      // etc. 
     }; 
    })(i) 
); 

的IIFE的目的是創建一個closure - 本地變量詞法範圍是「 卡住「以及在範圍內定義的任何function。這允許每個function (callback) {}具有其自己的j以及單個值i(因爲i將繼續改變值,因爲for循環繼續)。

0

回調是最酷的功能之一。回調只是另一個正常功能。實際上,您可以將函數本身作爲另一個函數中的參數傳遞。 說功能foo()做些什麼。在執行foo()之後,您可能想要執行其他操作。所以,爲了達到這個目的,你需要定義一個函數bar()並將這個函數作爲參數傳遞給函數foo()!

function foo(callback){ 
    // do something 
    callback(); 
} 

function bar(){ 
    // do something else 
} 

foo(bar()); 
//here we can see that a function itself is being passed as a param to function foo. 

瞭解更多瞭解here的正確鏈接。

而且

queries.push((function(j){})(i)); 
在JavaScript

,這是調用函數的另一種方式。

function(){ 
// do something. 
}(); 

您實際上並不需要定義函數名稱,並且可以直接調用它,而不需要名稱。你甚至可以通過params。

function(a){ 
alert(a)' 
}(10);