2016-08-14 87 views
1

我在看一個Node.js代碼示例,它使用「if(err){// code //);」語句來控制其功能的輸出 - 但是當函數被調用時,我看不到任何東西被傳遞給它們,就好像「err」參數是由隱藏的代碼在幕後定義的那樣...Javascript「err」函數參數 - 它是如何工作的?

下面的代碼是異步的,並且使用來自SDK的外部模塊,應該注意。

/* "client.sendEvent" sends the data contained within the variable "message" 
to its destination, when this is complete the callback function "printResultFor" 
is called and a string is passed to that */ 

    client.sendEvent(message, printResultFor('Message')); 

    //printResultFor looks like this: 

    var printResultFor = function (op) { 
     return function printResult(err, res) { 
     if (err) console.log(op + ' error: ' + err.toString()); 
      if (res) { 
       console.log(op + ' status: ' + res.constructor.name); 
      }; 

     }; 
    } 

我的問題是:

  1. 爲什麼這個回調函數需要返回一個嵌套函數?

  • 如何的 「ERR」 和 「RES」 的值傳遞給該嵌套函數?
  • 我也想知道答案就在於外部模塊中,但我不知道......

    (最後請注意:我是一個自學成才的新手使用JavaScript和節點,我敢肯定,這是微不足道的大多數人,但謝謝你的任何解釋和幫助,您可以提供。)

    +0

    '''addEventListener()'中的'Event'對象被提供給回調的相同方式。 – Marty

    回答

    5

    這就是所謂的錯誤第一個回調,它不是一個語言功能,但一個約定吧。

    作爲佛瑞德K.肖特說,在The Node.js Way - Understanding Error-First Callbacks

    1. 回調的第一個參數被保留用於一個錯誤對象。如果發生錯誤,將由第一個err參數返回。

    2. 回調的第二個參數保留給任何成功的響應數據。如果沒有發生錯誤,err將被設置爲空,並且任何成功的數據將在第二個參數中返回。

    基本上它說的是,如果你通過檢查的第一個參數知道任何錯誤。

    這是任何基於回調的nodejs庫的預期行爲,您應該設計您的接口。

    +0

    偉大的鏈接,謝謝你!我試圖研究錯誤處理 - 這解釋了爲什麼我從來沒有找到答案,因爲這是它的外觀回調約定。再次感謝您的解釋! – Sam3000

    2

    printResultFor被調用,並返回裏面定義的函數。無論調用printResultFor,然後調用它現在有權訪問的內部函數,因爲它已被返回。它只發生在你不想查找它的代碼中。

    例如:

    var printResult = printResultFor(something); 
    
    printResult(null, dataObjectHere); 
    

    通過這樣做,所述printResult具有通過閉合訪問op變量(因爲它是在printResultFor函數定義的,它可以訪問在其定義的所有變量和參數。)

    +0

    這真的很有幫助,我很高興知道這裏有一些看不見的元素,很好看,直到我現在去找他們...感謝您讓我走上正軌。 – Sam3000

    1
    1. 它並不需要不一定,因爲有很多方法對皮膚許多貓,但它使用被稱爲「鑽營」的功能編程模式。這裏是關於該主題的good introductory article,與javascript相關
    2. 節點中的err作爲回調中的第一個參數是一種常見模式。當沒有錯誤時,它通常是值nullres是您遇到錯誤時得到的數據。
    +0

    我之前沒有遇到過捲曲,感謝您的鏈接! – Sam3000

    相關問題