Запутался в случае закрытия Javascript - PullRequest
1 голос
/ 09 марта 2011

Я пишу код для node.js, используя драйвер node-mongodb.Я решил кэшировать объекты коллекции, когда получаю их следующим образом:

var db = connectionObject;

function getCollection(collectionName) {
    return function(callback) {
        var cache;

        if (cache) return callback(null, cache);

        db.collection(collectionName, function(err, collection) {
            return err ? callback(err) : callback(null, cache = collection);
        });
    }
}

var usersCollection = getCollection('users');
usersCollection(function(err, collection) {
    collection.find({}); // Rest of code here ...
});

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

return function(callback) {
    var cache = arguments.callee;

    if (cache.cached) return callback(null, cache.cached);

    db.collection(collectionName, function(err, collection) {
        return err ? callback(err) : callback(null, cache.cached = collection);
    });
}

Я все еще не понимаю, почему переменная 'cache' выходит из области видимости.Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 09 марта 2011

Я думаю, вы хотите это:

function getCollection(collectionName) {
    var cache;
    return function(callback) {

вместо того, что у вас есть сейчас:

function getCollection(collectionName) {
    return function(callback) {
        var cache;
1 голос
/ 09 марта 2011

Ничто не закрывается после cache после выполнения функции, возвращенной из getCollection (usersCollection).Нет функции, возвращаемой из этой области.

cache необходимо определить вне функции usersCollection, чтобы любая ссылка на него была захвачена.

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