2012-06-05 112 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函数,该函数将执行并继续执行逻辑