Node.js - 匿名函数中的参数而不传递变量?

时间:2015-05-31 21:16:01

标签: javascript node.js

我来自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 ++中毫无意义。

2 个答案:

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