簡體   English   中英

難以理解Node.js回調

[英]Trouble understanding Node.js callbacks

今天是我對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請求,並且在某個時刻調用該函數,以獲取響應並對響應進行一些操作。 我試圖理解的是調用的正確順序,以及在上述給定邏輯中變量的綁定是如何發生的。 編譯器如何知道如何將請求的返回值綁定到匿名函數? 基本上,我想了解此代碼片段在幕后的工作方式。

謝謝

您的問題並非特定於node.js,這基本上是javascript的功能。

基本上,您正在調用request() ,它的定義類似於function request(obj, callback)

在內部,http請求正在被調用,一旦完成,它將調用callback ,該callback實際上是一個函數指針。

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


    callback(err, response, body)
}

您的代碼實際上可以重組為:

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);

您基本上要做的是將函數指針作為變量發送。

我不知道您使用的是哪個庫,您似乎可以通過將方法分配給代碼的全局范圍(例如requestdonedb匿名化它們。

說的是:

  1. 這種縮進是可怕的,最初誤導了我在做什么,請gg=G (vim語法)您的代碼,以便正確縮進。
  2. request帶有兩個參數,一個配置對象和一個回調。
  3. db.createDbQuery 必須是一個阻止方法,否則您正在創建的匿名對象將沒有適當的值。
  4. request使用該配置值,使得一些類型的非阻塞I / O請求,並且以后會打電話給你提供的回調函數。 這意味着緊隨該request調用之后的代碼將您提供的回調執行之前執行。
  5. 一段時間后,請求數據將返回,Node.js的事件循環會將數據提供給庫的已注冊事件處理程序(該事件處理程序可能直接或可能不是您的回調,它可以對其進行處理,然后再調用事件處理程序) ,您不知道或不在乎)。
  6. 然后,該函數進行一些檢查,如果它們失敗則將引發錯誤,最后調用其作用域(在其他位置定義)中的done函數,該函數將執行並繼續執行邏輯流。

暫無
暫無

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

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