Ответ 1
Вот код, который я использую для игровой площадки базы данных фильмов. Я экспериментировал с событиями jQuery, но, наконец, решил, что этого достаточно, если данные передаются непрерывно. Моя коллекция тестов - 680 записей, с 20 полями и одним миниатюрным полем, которое составляет от 10 до 20 килобайт на крышку. Здесь код Coffeescript:
Movies = new Meteor.Collection("movies")
if Meteor.isClient
# starting with 10 items that the user sees a page fast
Session.set("queryLimit", 10)
# getting the item count from the server collection
Meteor.call 'getMoviesCount', (err, result) =>
Session.set('itemsInQuery',result)
# subscribe to a subset of the collection, and change the Session var on completion
# automatically changing the limit of the publishing function with autorun
Meteor.autorun ->
Meteor.subscribe "MoviesList", Session.get("queryLimit"), onComplete = ->
if Session.get("queryLimit") < Session.get('itemsInQuery')
queryLimit = Session.get("queryLimit") + 30 #change iterator depending on result size
Session.set("queryLimit", queryLimit )
# Client helper to add more items to handlebars template
Template.app.helpers movies: ->
Movies.find({})
if Meteor.isServer
Meteor.publish "MoviesList", (limit) ->
# show whole collections once limit is reached, by setting limit to 0
limit = 0 if limit > Movies.find().count()
console.log new Date(), limit
Movies.find({}, { limit: limit, fields: {title:1 } } ) #use fields to test different result sizes
Meteor.methods
getMoviesCount: (query) ->
return Movies.find().count()
И html:
<body>
{{> app}}
</body>
<template name="app">
{{#each movies}}
<p>{{title}}</p>
{{/each}}
</template>
Я сделал несколько быстрых тестов производительности, и выяснилось, что для нескольких строк текста на запись самый быстрый способ отправить данные клиенту - это ограничение около 100. Я также попробовал его с 10-20-килобайтными эскизами, которые встроены в файле. При использовании больших активов Chrome стал совершенно не реагировать, когда предел превысил 30 записей. Вот несколько статистических данных, сделанных на localhost (запустите 3 раза каждый):
limit seconds till last record rendered.
0 79s
010 121s
020 64s
030 45s
050 34s
100 16s
200 16s
Интересно отметить, что около 79 с, когда метеоритный сервер отправляет всю страницу за один проход (limit = 0). Я не уверен, как это возможно, потому что непрерывный поток должен быть самым быстрым. Поэтому, наверное, что-то смешное в моей статистике. Есть идеи?