我来自C / C ++背景,我在尝试围绕node.js的语法时遇到了麻烦。无论如何,我在网上找到了一些代码来解释阻塞代码和非阻塞代码之间的区别,这让我感到难过了好几个小时。我试过搜索和阅读书籍,但却找不到答案。示例代码从数据库中检索用户ID。
阻止版本:
function getUser(id) {
var user = db.query(id);
return user;
}
console.log('Name: ' + getUser(432).name);
非阻止版本(Node.js):
function getUser(id, callback) {
db.query(id, callback);
}
getUser(432, function (user) {
console.log(user.name);
});
我对阻止版本没问题,因为在该实例中,用户ID被分配给变量user
。我似乎无法理解的是匿名函数中的user
参数。似乎user
只是突然出现,然后有指令对其起作用,与现有变量没有任何关系。
该程序如何知道user
是什么?它如何与用户的ID进行任何连接?老实说,我不知道是不是我缺乏JavaScript / Node的知识,或者编写这段代码的人是否也没有完成它。我所知道的是,这在C / C ++中毫无意义。
答案 0 :(得分:2)
嗯,您已经要求程序取给您一个用户,并提供了一个接受参数的函数(或更多,取决于库)。操作完成后,getUser
将调用您传递的回调以及操作结果。
这是一个虚拟的getUser实现:
function getUser(id, callback) {
setTimeout(function() {
var result = {id: id, name: "Madara"};
callback(result);
}, 1000); // Wait a second before doing it. Asynchronous!
}
getUser(42, function(user) { console.log(user); });
该函数将等待一秒钟,然后调用您通过一个参数传递的回调,在这种情况下,是一个带有您传递的ID的对象," Madara"正如名字一样。
请注意,getUser
没有任何阻止,因此getUser
会立即返回 ,而无需等待回调被调用。
答案 1 :(得分:1)
如果我将你的例子翻译成C,也许它会对你有帮助。 我很久没有使用过C了,但我觉得它看起来像这样。
void getUser(int id, void (*callback)(User)) {
db.query(id, callback);
}
void printUserName(User user) {
printf(user.name);
}
getUser(432, &printUserName);