今天是我第一次涉足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请求,并且正在某个时刻调用该函数,该响应正在响应并对其执行某些操作。我想要理解的是调用的正确顺序以及变量的绑定如何在上面给出的逻辑中发生。编译器如何知道如何将请求中的返回值绑定到匿名函数?基本上,我希望了解这段内容的工作原理。
由于
答案 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)
我不知道您正在使用哪些库,看起来您可能通过将方法分配到代码的全局范围(如request
,done
和{}来匿名化它们。 {1}}。
我可以说的是:
db
(vim语法)你的代码,以便正确缩进。gg=G
有两个参数,一个配置对象和一个回调。request
必须是一种阻止方法,否则您创建的匿名对象将没有正确的值。db.createDbQuery
使用该配置值,生成某种非阻塞I / O请求,以后将调用您提供的回调函数。这意味着紧接request
调用之后的代码将在之前执行,您提供的回调将执行。request
函数(在其他地方定义)将执行并继续逻辑流执行。