0

今天是我第一次涉足 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 请求,并且正在某个时刻调用该函数,该函数正在获取响应并对其执行某些操作。我想了解的是调用的正确顺序以及变量的绑定如何在上述给定的逻辑中发生。编译器如何知道如何将请求的返回值绑定到匿名函数?基本上,我想了解这个片段的幕后工作原理。

谢谢

4

2 回答 2

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

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

于 2012-06-05T19:13:13.677 回答
1

我不知道您正在使用什么库,而且看起来您可能通过将方法分配到代码的全局范围(如requestdonedb.

说的是:

  1. 这种缩进很可怕,最初误导了我它在做什么,请gg=G(vim 语法)你的代码,以便它正确缩进。
  2. request接受两个参数,一个配置对象和一个回调。
  3. db.createDbQuery 必须是阻塞方法,否则您创建的匿名对象将没有正确的值。
  4. request使用该配置值,发出某种非阻塞 I/O 请求,稍后将调用您提供的回调函数。这意味着该request调用之后的代码将在您提供的回调执行之前执行。
  5. 一段时间后,请求数据会返回,Node.js 的事件循环会将数据提供给库的已注册事件处理程序(这可能是也可能不是您的直接回调——它可以对其执行某些操作,然后调用您的事件处理程序,你不知道也不在乎)。
  6. Then the function does some checks that will throw errors if they fail, and finally calls a done function in its scope (defined somewhere else) that will execute and continue the logical stream of execution.
于 2012-06-05T19:16:49.797 回答