2011-03-09 220 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函數之外定義,以便對其進行任何引用以便捕獲。