Использование фабричных методов в качестве альтернативы для передачи анонимных функций - PullRequest
0 голосов
/ 01 декабря 2010

Я смотрел видео на node.js и увидел, что говорящий говорит, что он предпочитает делать это, а не использовать анонимные обратные вызовы:

var server = Server.createServer(server.createReq(req,res));

Я думаю, это тоже хорошо, что именованная функция спараметры могут быть переданы вместо анонимной функции с закрытием.

Вопрос 1: Однако реализация createReq, вероятно, возвращает анонимную функцию, не так ли?

Как это лучше?Я вижу, что это лучше, потому что, в отличие от замыкания на уровне createServer, замыкание на уровне createReq более ограничено - оно не будет хранить ссылки на другие ненужные переменные (не req, res).

И, как сказал оратор, я думаю, это помогло бы лучше визуализировать отношения между различными частями кода.

Вопрос 2: Есть ли другие преимущества?

1 Ответ

0 голосов
/ 11 июля 2011

Причина, по которой вам может потребоваться вызвать функцию, которая возвращает функцию, может заключаться в том, что вы запускаете несколько серверов в одном и том же процессе и хотите, чтобы они использовали один и тот же обработчик запросов.

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

Например, что-то вроде этого непроверенного и неполного примера:

var server = Server.createServer(handleRequest);

function handleRequest(req, res) {
    new Client(req, res);
}

function Client(req, res) {
    this.req = req;
    this.res = res;

    this.body = "";
    req.on("data", function (chunk) {
        self.onData(chunk);
    });
}
Client.prototype.onData = function (chunk) {
    this.body += chunk.toString();
};

В этом примере используется небольшойанонимная функция для привязки обратных вызовов событий data к конкретному экземпляру Client, но все остальные функции имеют имена.

...