2011-03-09 8 views
1

node-mongodb 드라이버를 사용하여 node.js 코드를 작성했습니다. - 캐시 변수가 항상 정의되지 그렇지 않은 것을 제외하고 usersCollection 기능의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 ... 
}); 

반복 호출, 캐시 된 컬렉션 개체를 사용한다 : 나는이처럼 그들을 얻을 때 컬렉션 객체를 캐시로 결정했다. 이 코드를 변경하면 문제가 해결됩니다.

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); 
    }); 
} 

'캐시'변수가 범위를 벗어나는 이유에 대해 아직도 혼란 스럽습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 대신 당신이 지금 무슨의

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

:

+0

게시하기 전에 jsbeautifier 또는 jsfiddle을 사용하여 코드의 형식을 올바르게 지정하십시오. 가독성이 향상됩니다. –

답변

5

난 당신이 원하는 생각하는 기능이 getCollection (usersCollection)에서 반환 된 후

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

getCollection 함수에 캐시를 넣으면 getCollection ('users'), getCollection ('posts'), getCollection ('pages') – disc0dancer

+2

@ Disciscancer - 아니요, 이겼을 때 여러 컬렉션 객체가 덮어 씁니다. 't - getCollection()에 대한 각 호출에는 자체 "캐시"변수가 있습니다. – Pointy

+1

Doh, youre right :) 어리석은 나. – disc0dancer

1

아무것도 cache 이상 닫히지 않습니다 실행합니다. 해당 범위에서 반환되는 함수가 없습니다.

cache은 캡처 할 참조를 위해 usersCollection 함수 외부에서 정의해야합니다.

관련 문제