Это правильный код в Node.js?(переменная область видимости) - PullRequest
1 голос
/ 06 июля 2011
function user(req,res){
    var uuu = req.params.userid;
    processUserObject(uuu, function(user_object){ //This could take a long time...
        console.log(uuu); 
        res.send(JSON.stringify(user_object));
    });
};
app.get('/:userid',function(req,res){
    user(req,res);
});

Во-первых, предположим, что сайт получает много просмотров.(тысяч в секунду!)

Когда пользователь заходит на страницу со своим идентификатором, будет ли console.log(uuu) выводить правильный идентификатор?Что меня беспокоит (что касается переменной области видимости), так это то, что, когда человек A просматривает страницу и просматривает processUserObject, это может занять много времени, в течение которого человек B просматривает страницу, а меняет uuu ... приводя к console.log для вывода идентификатора лица B вместо идентификатора лица A.

Примечание: У меня есть это беспокойство, потому что, когда я был новичком вNode.js, я забыл инициализировать некоторые переменные с var.Когда мой сайт получил много посещений, мои пользователи заметили, что они получают информацию от посещений других пользователей ... ой.

1 Ответ

5 голосов
/ 06 июля 2011

Да, console.log(uuu) запишет правильное значение. Когда вы говорите это:

var uuu = req.params.userid;

Вы фиксируете текущее значение req.params.userid в локальной переменной uuu, а затем uuu фиксируется закрытием обратного вызова. Однако, если вы случайно сделали это:

uuu = req.params.userid;

Тогда вы будете захватывать значение req.params.userid в global uuu, и каждый из ваших обратных вызовов будет иметь одинаковые uuu, и вы получите обычная проблема закрытия. Каждый из ваших

function(user_object) { ... }

анонимные функции - это отдельные и разные сущности со своими собственными отдельными и отличными uuu переменными (при условии, что вы говорите var uuu, а не uuu, конечно).

Кстати, если вы в конечном итоге получите миллиард запросов в секунду, тепло от ваших перегруженных процессорами расплавит стены между этим миром и следующим, освобождая старших богов от Р'лайха. И если это произойдет, uuu не будет иметь никакого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...