2012-04-11 5 views
22

이 코드가 "0"으로 나타나는 이유는 무엇입니까? "1"을 반환하면 안됩니까?Meteor - 클라이언트 시작시 컬렉션 사용

Messages = new Meteor.Collection("messages"); 

if (Meteor.is_client) { 
    Meteor.startup(function() {  
     alert(Messages.find().count()); 
    }); 
} 

if (Meteor.is_server) { 
    Meteor.startup(function() { 
     Messages.insert({text: "server says hello"}); 
    }); 
} 

내가 할 경우 "Messages.find(). COUNT()"유성 클라이언트가 시작될 때 나중에, 그것은, 기본적으로 1

+2

동시성을 환영 그것. – Raynos

+1

@Raynos 동시성 문제처럼 보이지 않습니다. 클라이언트 시작 핸들러가 실행될 때마다 발생합니다. – pomber

+0

동시성 문제입니다. 두 가지를 동시에 서버에서 실행하고 클라이언트에서 동시에 실행하는 것이 문제입니다. 서버가 처음 마술처럼 끝날 것으로 예상한다. – Raynos

답변

37

반환는 서버에 연결하여 구독 정의한 Meteor.Collection의 문서 서버 연결을 설정하고 문서를받는 데 어느 정도 시간이 걸리기 때문에 완료하는 데 약간의 시간이 걸립니다.

Meteor.startup()은 jQuery에서 $()과 비슷합니다. 클라이언트 DOM이 준비되면 인수를 실행합니다. 이 아닐 경우은 클라이언트 컬렉션이 서버에서 모든 문서를 수신 할 때까지 기다립니다. 따라서 코드를 작성한 방법과 같이 에 대한 호출은 항상 너무 일찍 실행되어 0을 반환합니다.

컬렉션을 서버에서 처음 다운로드 할 때까지 코드 실행을 기다리려면 Meteor.subscribe()을 사용해야합니다. 컬렉션에 명시 적으로 가입하십시오. subscribe()은 초기 문서 집합이 클라이언트에있을 때 실행되는 콜백을 사용합니다.

은 참조 :

meteor-publish

+9

이 작업을 수행하는 방법에 대한 코드 예를보고 싶습니다. –

+0

'Meteor.subscribe()'를 사용할 때, 기본 "collection of all documents subscribe"동작을 어떻게 든 꺼야합니까? – bijan

+3

@bijan (또는 같은 질문을 가진 다른 사람들), 예, 자동 배포 패키지를 제거해야합니다 : $ meteor remove autopublish. 간단한 설명을 위해 – jtblin

0

meteor-subscribe 그냥 모음 클라이언트에서 사용할 준비가되면 알 수있는 방법에 대한 코드 예제 후속합니다.

설명 @debergalis, 당신은 Meteor.subscribe 방법을 사용한다 - 그것은 콜백의 몇 가지를 받아, 특히 onReady

예를 들어 :

if(Meteor.isClient){ 

    Meteor.subscribe("myCollection", { 

     onReady: function(){ 

      // do stuff with my collection 

     } 

    }); 

}