簡體   English   中英

如何在Node.js中處理異步函數

[英]How to handle async functions in nodejs

我一直在學習Node.js,而我的腦海中一直困擾着我的是基於Node.js的異步編程。 也許我做錯了事,但是盡管我做了所有的研究,但我仍無法確定應該如何適應來自同步編程背景的技術。 如果有人想從任何地方調用func2,那么如果有人給我一個基於以下結構的簡單異步示例,我將不勝感激。

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

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

我偶然發現的問題是obj在func1中打印為未定義,而func2對此沒有任何問題。 當我將這些函數相互嵌套時,它起作用了,使我相信由於nodejs的異步特性,它在func2完成之前便開始登錄func1。 我的假設錯了嗎?

在上面的示例中,我遇到的困難是如何對函數進行編碼,而不是將它們相互嵌套,因此我可以一次從幾個不同的函數調用func2。 我已經研究了回調,但無法理解函數內部帶有函數的各種答案中給出的示例。

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

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等語言,在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. 調用匿名函數時,使用傳遞給obj的值調用console.log
  4. 聲明一個名為function2的新函數,該function2接受單個參數callbackFn
  5. 用一個參數調用為callbackFn傳遞的值,即我們從某處獲得的obj

因此,聲明順序為1、4、2; 並且執行順序為2、5、3。

*好的,他們有點特別。 它們的定義被提升 ,您可以執行它們所代表的代碼,並且它們的聲明創建作用域閉包 但是這些都是另一個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM