2012-04-11 19 views
22

Tại sao mã này hiển thị "0"? Không nên trả lại "1"?Meteor - Sử dụng bộ sưu tập khi khởi động máy khách

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

Nếu tôi làm "Messages.find(). Count()" sau đó, nó sẽ trả về 1.

+2

Concurrency, chào mừng đến nó. – Raynos

+1

@Raynos Nó không giống như một vấn đề đồng thời. Nó xảy ra mỗi khi trình xử lý khởi động của máy khách được thực thi. – pomber

+0

Đây là vấn đề tương tranh, vấn đề là bạn đang chạy hai thứ đồng thời một trên máy chủ và một trên máy khách. và bạn mong đợi máy chủ một kết thúc kỳ diệu trước tiên – Raynos

Trả lời

37

Theo mặc định, khi một khách hàng Meteor khởi động, nó kết nối đến máy chủ và đặt mua tài liệu trong bất kỳ Meteor.Collection nào bạn đã xác định. Việc này mất một chút thời gian để hoàn thành, vì luôn có một số độ trễ trong việc thiết lập kết nối máy chủ và nhận tài liệu.

Meteor.startup() trên máy khách rất giống như $() trong jQuery - nó chạy đối số của nó khi DOM khách hàng sẵn sàng. Nó không không chờ bộ sưu tập của khách hàng của bạn nhận tất cả tài liệu của họ từ máy chủ. Vì vậy, cách bạn đã viết mã, lệnh gọi tới find() sẽ luôn chạy quá sớm và trả về 0.

Nếu bạn muốn đợi mã sau khi bộ sưu tập được tải xuống lần đầu tiên từ máy chủ, bạn cần sử dụng Meteor.subscribe() để đăng ký một bộ sưu tập rõ ràng. subscribe() nhận một cuộc gọi lại sẽ chạy khi bộ tài liệu ban đầu nằm trên máy khách.

Xem:

meteor-publishmeteor-subscribe

+9

Tôi rất thích xem một ví dụ về cách thực hiện điều này. –

+0

Khi sử dụng 'Meteor.subscribe()', tôi có phải tắt chức năng "đăng ký tất cả tài liệu của một bộ sưu tập" mặc định không? – bijan

+3

@bijan (hoặc cho những người khác có cùng câu hỏi), có, bạn cần xóa gói tự động xuất bản: $ meteor remove autopublish. – jtblin

0

Chỉ cần để theo dõi với một mã ví dụ làm thế nào để biết khi nào một bộ sưu tập đã sẵn sàng để sử dụng trên máy khách.

Như @debergalis mô tả, bạn nên sử dụng cách tiếp cận Meteor.subscribe - nó chấp nhận một vài callbacks, đáng chú ý onReady

Ví dụ:

if(Meteor.isClient){ 

    Meteor.subscribe("myCollection", { 

     onReady: function(){ 

      // do stuff with my collection 

     } 

    }); 

} 
Các vấn đề liên quan