2014-01-25 39 views
0

我一直在學習nodejs,並且有一件事情繼續令我不解的是Nodejs構建的異步編程。也許我做錯了什麼,但儘管我所有的研究都是如此,但我還是無法將自己的想法應用於如何適應來自同步編程背景的問題。如果有人給我一個簡單的基於下面結構的異步例子,我會非常感激,因爲你想從任何地方調用func2。如何處理nodejs中的異步函數

function1(){ 
    var obj = function2(); 
    console.log(obj); //"undefined". 
} 

function2(){ 
    //do stuff with DB and get obj 
    console.log(obj); //logs obj. 
    return obj; 
} 

我偶然發現的問題是,由於未定義在FUNC1,而FUNC2與它沒有任何問題的obj打印。當我將函數嵌套在其他函數中時,它使我相信由於nodejs的異步特性,它在func2完成之前就開始登錄func1。我的假設錯了嗎?

我在上面的例子中掙扎的是我如何編寫函數而不是將它們嵌套在一起,所以我可以一次調用幾個不同函數的func2。我研究過回調函數,但無法理解函數內部函數在各種答案中給出的例子。

+0

這實際上是一個JavaScript問題,而不是nodejs專有的問題。 – OrangeDog

+0

真的嗎?我認爲只有nodejs是異步的,而不是整個JS。當然,我只使用JS中的HTML,也許這就是我的困惑來自哪裏.. – Araklaj

+0

AJAX - *異步* JavaScript和XML – OrangeDog

回答

0

您必須在函數中定義函數(即回調函數)。

1 function function1(){ 
2 function2(function(obj) { 
3  console.log(obj); //logs obj. 
    }); 
    } 

4 function function2(callbackFn){ 
    //do stuff with DB and get obj 
    console.log(obj); //logs obj. 
5 callbackFn(obj); 
    } 

function2可以從很多地方在被調用一次,不只是function1

如果你可以更具體地瞭解你不瞭解的內容,那麼你可能會得到更好的答案。


函數是值,就像數字,字符串和對象一樣。

這是函數式編程的核心基礎,可能是你還沒有掌握的東西。在JavaScript中,和許多語言一樣,函數不是特殊的*。這與C或Java等語言不同,其中函數/方法與您在代碼中處理的常見值不同。

2; // Here is a number 
var a = 2; // I can assign it to a variable 
console.log(2); // I can pass it as a function argument 

function() {} // Here is a function 
var a = function() {}; // I can assign it to a variable 
console.log(function() {}); // I can pass it as a function argument 

function jim() {} // This function's name is jim 
var a = jim; // I can assign it to a variable 
console.log(jim); // I can pass it as a function argument 

(function() {})(); // I can call a function without giving it any names 
jim(); // I can call a named function 
a(); // I can call a function via a variable 
jim.call(this, arg1); // Or I can get complicated 

因此,我們可以聲明函數並將它們傳遞給它們,分別調用它們。現在,我們開始的代碼如何?

  1. 聲明一個叫function1新功能,它沒有參數
  2. function1被調用,調用function2有一個參數,一個新的匿名函數,它接受一個obj參數
  3. 當匿名函數被調用,調用console.log與通過了obj
  4. 值聲明一個名爲function2新的功能只有一個參數callbackFn
  5. 打電話過去了callbackFn帶一個參數值時,obj我們從某處

變得如此的聲明順序爲1,4,2;執行順序爲2,5,3。

*好的,它們有點特別。他們的定義是hoisted,您可以執行它們代表的代碼,並且其聲明創建scopeclosures。但這些都是另一次的問題。

+0

嗨,感謝您的闡述!我不明白的部分是在調用function2時將函數(obj)作爲參數發送,它如何將值返回給function1(callbackFn(obj)行)。我無法真正掌握那裏發生的事情的邏輯。 – Araklaj

+0

它不會將值返回給函數1,它會執行作爲函數2的參數給出的函數。 function1只是不知道什麼時候會執行callbackFn。它叫Continuation Passing,它基本上就像一個Async GOTO。 – mpm

+0

非常感謝您花時間將OrangeDog分解。我想我知道了,第2行將一個無名函數傳遞給函數2,函數2在完成獲取obj的主要任務後執行。這是我感到困惑的部分,謝謝! – Araklaj