2014-09-30 3 views
1

저는이 자바 스크립트를 처음 접했고 몽구스 'find'스코프에 대해 약간의 의구심을 가지고 있습니다.몽구스 findOne 범위 의심

나는이 문제를 이해하려고 아래 코드를 작성했습니다.

아래 코드는 쇼핑 컬렉션을 검색 한 다음이 쇼핑에 할당 된 상점을 검색합니다.

storeMap는에 storeId => storeObject의 해시 맵이지만, Store.findOne 범위 끝, storeMap는

var storeMap = {}; 
Shopping.findOne({ name: shoppingName }, function(err, shopping){ 
        shopping.stores.forEach(function(storeId) { 
          Store.findOne({_id: storeId}, function(err, store) { 
            if(err) console.log(err); 
            console.log(store); //prints out store data 
            storeMap[storeId] = store; 
            console.log(storeMap); //prints out store data 
          }); 
          console.log(storeMap); //prints out an empty array 
        }); 
      }); 

그럼, 왜 내 storeMap 배열이 인쇄되어 ... 빈 배열로 롤백 보인다 때 저장소 배열 대신 빈 배열?

답변

1

Store.findOne은 node.js와 마찬가지로 비동기식이며 callback을 사용합니다.

function(err, store) { 
    if(err) console.log(err); 
    console.log(store); //prints out store data 
    storeMap[storeId] = store; 
    console.log(storeMap); //prints out store data 
} 

그리고 Store.findOne 시간이 오래 걸릴 수있는 작업을, 완료하면 이것은 단지 실행 : 콜백은 storeMap가 설정됩니다 곳입니다.

그러나 다음 라인은 console.log(storeMap);이지만 콜백이 실행되기 전에 즉시 실행됩니다. 따라서 storeMap은 여전히 ​​비어 있습니다.

node.js의 콜백 패턴에 대한 몇 가지 예/설명을 살펴 보는 것이 좋습니다. 이해하는 것이 중요합니다.