유성 문서의 메시지 수 예제는 어떻게 작동합니까?
문서에서 이 예를 완전히 이해하는 데 어려움을 겪고 있습니다.여러 가지 방법으로 운영해 보았습니다. 어떻게 작동하는지 등을 관찰할 수 있었습니다.
이것을 어떻게 구독합니까?이 작업에 필요한 클라이언트 사이드 코드를 포함할 수 있습니까?
라는 이 있습니까?messages-count
는 사입니다.Room
메시모 ?▁can▁example?▁defin▁▁in▁the▁the▁?▁we음?컬렉션 정의를 예제에 포함할 수 있습니까?
이것에 대한 어떤 팁도 좋을 것입니다!
참고: 이 코드는 이 질문이 처음 게시되었을 때(2012년 5월) 나타난 코드입니다.이제는 더 간단합니다.
// server: publish the current size of a collection
Meteor.publish("messages-count", function (roomId) {
var self = this;
var uuid = Meteor.uuid();
var count = 0;
handle = Room.find({room_id: roomId}).observe({
added: function (doc, idx) {
count++;
self.set("messages-count", uuid, "count", count);
self.flush();
},
removed: function (doc, idx) {
count--;
self.set("messages-count", uuid, "count", count);
self.flush();
}
// don't care about moved or changed
});
// remove data and turn off observe when client unsubs
self.onStop(function () {
handle.stop();
self.unset("messages-count", uuid, "count");
self.flush();
});
});
좀 더 명확한 설명을 써달라고 요청해주셔서 감사합니다.여기 제 의견과 함께 더 많은 예가 있습니다.제가 정리한 몇 가지 버그와 불일치가 있었습니다.다음 문서 릴리스에서는 이 기능을 사용합니다.
Meteor.publish
매우 유연합니다.기존 MongoDB 컬렉션을 고객에게 게시하는 것에 국한되지 않습니다. 원하는 모든 것을 게시할 수 있습니다.구체적으로.Meteor.publish
클라이언트가 등록할 수 있는 문서 집합을 정의합니다.각 문서는 일부 컬렉션 이름(문자열)에 속하며 고유합니다._id
필드에 JSON 속성 집합이 있습니다.세트의 문서가 변경되면 서버는 변경사항을 등록된 각 클라이언트로 전송하여 클라이언트를 최신 상태로 유지합니다.
여서정의문집다같음습다니과합서은라는 하겠습니다."counts-by-room"
이 " 이이지집단문들있다습니어름"인 합니다."counts"
에는 두의 필드가 : a 서에는두있습다니: aroomId
방아이로디, 고의리그,로,▁the▁with고그디리▁room▁and.count
해당 룸의 총 메시지 수입니다.MongoDB라는 이름의 MongoDB .counts
이것은 Meteor 서버가 클라이언트로 전송하고 클라이언트 측 컬렉션에 저장할 컬렉션의 이름일 뿐입니다.counts
.
위해, 기능은 위게기시능은의리우이해를 합니다.roomId
클라이언트에서 오고 해당 룸에 있는 모든 메시지(다른 곳에서 정의됨)의 쿼리를 관찰하는 매개변수입니다.는 더 효율적인 더효적방수있다니습사를 할 수 .observeChanges
전체 문서가 필요하지 않고 새 문서가 추가 또는 제거되었다는 지식만 있으면 되므로 여기서 쿼리를 관찰하는 형식입니다.마다로 새 roomId
콜백을 통해 내부 수를 늘린 다음 업데이트된 총계로 새 문서를 클라이언트에 게시합니다.메시지가 제거되면 메시지 수가 줄어들고 클라이언트에 업데이트가 전송됩니다.
우리가 처음 전화할 때observeChanges
얼마간의added
이미 존재하는 각 메시지에 대해 콜백이 즉시 실행됩니다.이후 메시지가 추가되거나 제거될 때마다 변경 내용이 실행됩니다.
우리의 게시 기능은 또한 다음을 등록합니다.onStop
클라이언트가 구독을 취소할 때 정리할 핸들러입니다(수동으로 또는 연결이 끊어졌을 때).이 핸들러는 클라이언트에서 특성을 제거하고 실행 중인 항목을 해체합니다.observeChanges
.
새 클라이언트가 구독할 때마다 게시 기능이 실행됩니다."counts-by-room"
각 은 그서각고은객을 갖게 될 입니다.observeChanges
그것을 대신하여 운영되는.
// server: publish the current size of a collection
Meteor.publish("counts-by-room", function (roomId) {
var self = this;
var count = 0;
var initializing = true;
var handle = Messages.find({room_id: roomId}).observeChanges({
added: function (doc, idx) {
count++;
if (!initializing)
self.changed("counts", roomId, {count: count}); // "counts" is the published collection name
},
removed: function (doc, idx) {
count--;
self.changed("counts", roomId, {count: count}); // same published collection, "counts"
}
// don't care about moved or changed
});
initializing = false;
// publish the initial count. `observeChanges` guaranteed not to return
// until the initial set of `added` callbacks have run, so the `count`
// variable is up to date.
self.added("counts", roomId, {count: count});
// and signal that the initial document set is now available on the client
self.ready();
// turn off observe when client unsubscribes
self.onStop(function () {
handle.stop();
});
});
이제 클라이언트에서는 일반적인 Meteor 구독처럼 이를 처리할 수 있습니다.먼저, 우리는 필요합니다.Mongo.Collection
계산된 카운트 문서를 보관할 수 있습니다.가 " " "라는 이름의 하고 있기 입니다."counts"
우리는 지나갑니다"counts"
로서의 으로서.Mongo.Collection
시공자
// client: declare collection to hold count object
Counts = new Mongo.Collection("counts");
그러면 구독할 수 있습니다.(수집을 선언하기 전에 실제로 구독할 수 있습니다.Meteor는 업데이트를 저장할 위치가 있을 때까지 수신되는 업데이트를 대기열에 넣습니다.)구독의 이름은 다음과 같습니다."counts-by-room"
한 가지 주장이 필요합니다. 현재 룸의 ID입니다.제가이걸안싸요놨어에 안에 .Deps.autorun
서로로서Session.get('roomId')
변경사항이 발생하면 클라이언트는 자동으로 이전 룸의 카운트에서 등록을 취소하고 새 룸의 카운트를 다시 등록합니다.
// client: autosubscribe to the count for the current room
Tracker.autorun(function () {
Meteor.subscribe("counts-by-room", Session.get("roomId"));
});
마침내, 우리는 그 문서를 가지고 왔습니다.Counts
클라이언트의 다른 Mongo 컬렉션처럼 사용할 수 있습니다.이 데이터를 참조하는 템플리트는 서버가 새 카운트를 보낼 때마다 자동으로 다시 그립니다.
// client: use the new collection
console.log("Current room has " + Counts.findOne().count + " messages.");
Leonhardt Wille이 말했듯이, 이 솔루션의 단점은 Meteor가 Mongo 서버에서 전체 항목 모음을 다운로드하여 계산한다는 것입니다.gist.github.com/3925008 에 있는 그의 솔루션이 더 낫지만 새 항목을 삽입하면 카운터가 업데이트되지 않습니다.
여기 제 반응형 솔루션이 있습니다.
컬렉션:
Players = new Meteor.Collection("players");
PlayersCounts = new Meteor.Collection("players_counts")
서버:
Meteor.publish("players_counts", function(){
var uuid = Meteor.uuid()
var self = this;
var unthrottled_setCount = function(){
cnt = Players.find({}).count()
self.set("players_counts", uuid, {count: cnt})
self.flush()
}
var setCount = _.throttle(unthrottled_setCount, 50)
var handle = Meteor._InvalidationCrossbar.listen({collection: "players"}, function(notification, complete){
setCount();
complete();
})
setCount();
self.complete()
self.flush()
self.onStop(function(){
handle.stop();
self.unset("players_counts", uuid, ["count"]);
self.flush();
});
});
고객:
Meteor.subscribe("players_counts")
Template.leaderboard.total = function(){
var cnt = PlayersCounts.findOne({})
if(cnt) {
return cnt.count;
} else {
return null;
}
}
자기 자신이 있는 곳에서 문제의 해결책을 찾았습니다.flush()는 클라이언트에 수천 개의 업데이트를 보내고 있습니다. 다음을 계산할 때 _.discounce를 사용하십시오.
count = 0
throttled_subscription = _.debounce =>
@set 'items-count', uuid, count: count
@flush()
, 10
handle = Items.find(selector).observe
added: =>
count++
throttled_subscription()
removed: =>
count--
throttled_subscription()
이렇게 하면 카운트가 설정되고 변경되지 않은 10ms 후에만 구독이 플러시됩니다.
힌트를 주신 #meteor의 @possibilities 덕분입니다.
언급URL : https://stackoverflow.com/questions/10565654/how-does-the-messages-count-example-in-meteor-docs-work
'programing' 카테고리의 다른 글
Windows 2012 Server에서 Azure 배포가 Windows 2008 Server보다 느린 이유 (0) | 2023.05.16 |
---|---|
문자열을 개체로 변환MongoDB의 ID (0) | 2023.05.16 |
MVC에서 PDF를 브라우저로 되돌리는 방법은 무엇입니까? (0) | 2023.05.16 |
LINQ에서 리스트 평탄화 (0) | 2023.05.16 |
Brew 서비스를 통해 실행 중인 Postgres 서버에 연결할 수 없습니다. (0) | 2023.05.16 |