2013-04-27 4 views
1

저는 mongojs와 함께 작업 중이며 mongodb에서 가져온 객체에서 필드를 가져와야합니다. 나는 필드를 반환하는 방법을 이해할 수 없다 :자바 스크립트 (mongojs) : 함수의 값을 반환하십시오.

function retrieveVertById(id){ 

    var result = []; 
    db.clusters.find({id: id}, function (err, clusters){ 
    if(err || !clusters) console.log("No cluster found"); 
    else clusters.forEach(function (cluster) { 

    vert = cluster["vertices"]; 
    result.push(vert); 
    console.log(result); 


    }); 
}) 
return result; 
}; 

var a = retrieveVertById("001"); 
console.log(a); 

'대해 forEach'내부의 프린트가 올바른 값을 출력합니다. (예를 [[[8, 2, 2], [2, 2, 5 ], [2, 2, 2], [5, 2, 2]]]) 반대로 사이클 외부의 인쇄에는 빈 배열이 표시됩니다. 반환과 함께 작동하지 않는 것은 무엇입니까? 미리 도움을 주셔서 감사합니다.

+0

을 console.log (VERT)이 괜찮습니다? – monkeyinsight

+0

예, forEach의 console.log (vert)도 올바른 값을 인쇄합니다. –

+0

질문을 좀 더 잘 설명해 주시겠습니까? 프린트 란 console.log를 의미합니까? 어떤 console.log가 올바른 값,'a' 또는'return result를 보여주지 않는가, 당신은 자신의'id'를 만들었습니까, 아니면'_id'로 착각 했습니까? – Datsik

답변

1

나는 mongojs를 사용하지 않았지만 모든 db 조회는 거의 비동기식입니다. 즉, db.clusters.find에 전달 된 함수는 즉시 실행되지 않고 mongo에서 비동기 호출이 반환 될 때 사용됩니다. 대신 retrieveVertById에서 값을 반환하는 대신 콜백 함수를 시도 :

function retrieveVertById(id, successCallback) { 

    db.clusters.find({ 
    id: id 
    }, function (err, clusters) { 
    if (err || !clusters) { 
     console.log("No cluster found"); 
    } else { 
     var result = []; 
     clusters.forEach(function (cluster) { 
      vert = cluster["vertices"]; 
      result.push(vert); 
     }); 
     successCallback(result); 
    } 
    }); 
}; 

retrieveVertById("001", function(result) { 
    console.log(result); 
}); 
+0

콜백으로 필드를 차지할 수있었습니다. 시간 내 주셔서 대단히 감사합니다! –

+0

예제의 맨 아래에서'retrieveVertById'를 호출하면 콜백을 익명 함수로 전달할 것입니다. 'retrieveVertById'에게'successCallback'이라는 두 번째 매개 변수를주었습니다. 그래서'successCallback (result);'행은 실제로 익명 함수를 호출합니다 :'function (result) {console.log (result); }'내가 인수로 전달한. 비동기 프로그램을 작성할 때는 콜백 함수를 이해해야합니다. – ljfranklin

+0

@FrancescoMaglia - 도움이 되니 기쁩니다! 이 질문을 닫으려면 수락 된 답을 표시하십시오. – ljfranklin

0

아, 내가 볼 ... 당신은 자바 스크립트 (대해 forEach 후 비동기 언어

return result; 

떨어져 있음을 숙지가) 대해 forEach 내부에서 결과를 반환하지 않습니다(). 마지막 값을 파싱 한 후 결과를 보내야합니다.

var i = 0; 
clusters.forEach(function (cluster) { 
    vert = cluster["vertices"]; 
    result.push(vert); 
    if (i >= clusters.length) 
     return result; 
    i++; 
}); 
+0

몇 가지 문제가 있습니다. 이 예제에서 중첩 된 함수가 여러 개 있기 때문에 forEach 본문의'return' 문은'bubble-up '되지 않고'retrieveVertById' 함수의'return' 역할을합니다. 둘째로,'db.cluster.find' 메쏘드가 여러분이 말한 것처럼 비동기 적이라면, 콜백 함수를 사용하지 않고서도 값을 반환 할 수 없습니다. – ljfranklin

+0

도 마찬가지입니다. 그냥 js가 비동기입니다. – monkeyinsight

관련 문제