2012-06-05 168 views
0

今天是我第一次涉足nodejs,我非常難以理解下面一段邏輯流程的方式。邏輯如下:麻煩理解Node.js回調

request({ uri: db.createDbQuery('identifier:abcd1234') }, 
        function(err, response, body) { 
         response.should.have.status(200); 
         var search = JSON.parse(body); 
         search.response.numFound.should.equal(1); 
         done(); 
        }); 
     }); 

在一個較高的水平我不明白的是,一個HTTP請求被製成,並且功能在某些關鍵時刻,正在響應,並做一些它被調用。我試圖理解的是調用的正確順序,以及變量綁定如何在上述給定的邏輯中發生。編譯器如何知道如何將請求的返回值綁定到匿名函數?基本上,我想了解這些代碼片段如何工作。

感謝

+0

這不是一個節點js的問題,它是關於匿名函數以及如何由編譯器/解釋器處理的。在javascript中的一個函數其變量 – Jarry

回答

3

你的心不是問題具體到node.js的,這基本上是JavaScript的一個特點。

基本上你在呼喚request()這就好比function request(obj, callback)

內部定義,HTTP請求被調用,一旦其完成,它會調用callback這實際上是一個函數指針。

var options = { uri: db.createDbQuery('identifier:abcd1234') }; 
var request_callback = function(err, response, body) { 
         response.should.have.status(200); 
         var search = JSON.parse(body); 
         search.response.numFound.should.equal(1); 
         done(); 
        }; 
request(options, request_callback); 

什麼你基本上是在做一個函數指針作爲一個變量被髮送:作爲

function request(obj, callback){ 
    //http request logic... 
    var err = request_logic_internal_function(); 
    var response = ... 
    var body = ... 


    callback(err, response, body) 
} 

您的代碼其實是可以重組。

+0

感謝您的答覆。有一點讓我困惑的是,回調簽名是函數(err,response,body),這意味着在請求的定義中,回調被調用參數err,response和body。回調的參數是否通常用於某個地方? –

+0

是的,api的將有關於回調參數的文檔 –

1

我不知道你使用的是什麼庫(IES),它看起來像你可能已經通過分配方法到你的代碼的喜歡requestdonedb全球範圍內匿名他們。

可以說的是:

  1. 這壓痕是可怕的,最初誤導我就可以在做什麼,請gg=G(VIM語法)的代碼,以便它是正確的縮進。
  2. request需要兩個參數,一個配置對象和一個回調。
  3. db.createDbQuery必須是一種阻止方法,或者您正在創建的匿名對象不具有正確的值。
  4. request使用該配置值,進行某種非阻塞I/O請求,並且後面的將調用您提供的回調函數。這意味着在您撥打之後立即執行的代碼將在之前執行
  5. 一段時間後,請求數據會回來,Node.js的事件循環會將數據提供給庫的註冊事件處理程序(這可能是也可能不是你的回調 - 它可以做些什麼,然後打電話給你之後的事件處理程序,你不知道或真正關心)。
  6. 然後,該函數執行一些檢查,如果它們失敗將會拋出錯誤,最後在其範圍內(定義在其他地方)調用done函數,該函數將執行並繼續執行邏輯