2011-03-09 224 views
1

我正在使用node-mongodb驱动程序编写一些node.js代码。我决定缓存对象集合,当我得到他们这样的:关于Javascript关闭案例的困惑

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'变量超出范围的原因感到困惑。我究竟做错了什么?

+0

使用jsbeautifier或jsfiddle在发布之前正确地设置您的代码的格式。它提高了可读性。 – 2011-03-09 16:43:03

回答

5

我想你想要这样的:

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

,而不是你有什么现在:

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

如果我把缓存放在getCollection函数中,它会被不同的集合对象覆盖,例如:getCollection('users'),getCollection('posts'),getCollection('pages') – disc0dancer 2011-03-09 16:47:15

+2

@Discodancer - no,它赢了't - 每次调用“getCollection()”都会有自己的“缓存”变量。 – Pointy 2011-03-09 16:49:05

+1

Doh,你是对的:)傻我。 – disc0dancer 2011-03-09 16:50:04

1

没有关闭过cache后的功能从getCollectionusersCollection)返回执行。没有从该范围返回的函数。

cache需要在usersCollection函数之外定义,以便对其进行任何引用以便捕获。