无法理解Node.js回调

时间:2012-06-05 19:06:30

标签: javascript node.js callback mocha

今天是我第一次涉足nodejs,我特别难以理解下面这条逻辑流的方式。逻辑如下:

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请求,并且正在某个时刻调用该函数,该响应正在响应并对其执行某些操作。我想要理解的是调用的正确顺序以及变量的绑定如何在上面给出的逻辑中发生。编译器如何知道如何将请求中的返回值绑定到匿名函数?基本上,我希望了解这段内容的工作原理。

由于

2 个答案:

答案 0 :(得分:3)

你的问题不是node.js特有的,这基本上是javascript的一个特性。

基本上您正在调用request(),其定义类似于function request(obj, callback)

在内部,http请求被调用,一旦完成,它就会调用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);

你基本上做的是将函数指针作为变量发送。

答案 1 :(得分:1)

我不知道您正在使用哪些库,看起来您可能通过将方法分配到代码的全局范围(如requestdone和{}来匿名化它们。 {1}}。

可以说的是:

  1. 那个缩进很糟糕,最初误导了我的工作,请db(vim语法)你的代码,以便正确缩进。
  2. gg=G有两个参数,一个配置对象和一个回调。
  3. request 必须是一种阻止方法,否则您创建的匿名对象将没有正确的值。
  4. db.createDbQuery使用该配置值,生成某种非阻塞I / O请求,以后将调用您提供的回调函数。这意味着紧接request调用之后的代码将在之前执行,您提供的回调将执行。
  5. 一段时间之后请求数据将返回,Node.js的事件循环将数据提供给库的已注册事件处理程序(可能是也可能不是您的回调 - 它可以对它做一些事情,然后调用你的之后的事件处理程序,你不知道或真的在意)。
  6. 然后该函数执行一些检查,如果它们失败将抛出错误,最后在其范围内调用request函数(在其他地方定义)将执行并继续逻辑流执行。