Подтвердить что ты не робот

Ember-Data.find() vs .all() - как управлять кешем?

Мне сказали, что для того, чтобы не делать запрос все время, можно использовать метод .all() для загрузки данных, хранящихся в хранилище. Но как Эмбер занимается кешем? У меня есть несколько вопросов.

Как вы управляете кешем? Когда вы используете .find() и когда .all(). Используете ли вы .find(), а затем .all()? Как долго?

Имеет ли .all() срок истечения срока действия, чтобы через какое-то время он мог сделать новый запрос? Или он использует локальное хранилище, поэтому мне нужно его вручную очистить?

Предположим, что у меня есть некоторые данные, которые я хотел бы обновлять только один раз в неделю? Как мне это сделать? Теперь каждый раз, когда я вхожу или повторно посещаю тот же маршрут, создается новый запрос. Как я могу избежать этого?

4b9b3361

Ответ 1

Итак, начнем с ответа на вопрос из вашего комментария:

Я бы предпочел узнать, как загрузить данные при запуске приложения (а не через маршруты, поскольку мне не нужно его часто обновлять). Возможно ли это,

Итак, технически это по-прежнему по маршрутам, но лучший способ загрузить данные, когда приложение "запускается", осуществляется с помощью крючка модели приложения.

App.ApplicationRoute = Ember.Route.extend({
  model: function({
    return App.Post.find();
  })
})

Маршрутизатор будет ждать обещания, возвращаемого функцией find(), чтобы вы могли убедиться, что ответ от сервера вернулся до того, как будут введены другие маршруты.

Как вы управляете кешем?

В основном вы не беспокоитесь об этом. Вы можете обновить() отдельную запись после некоторого таймаута, если необходимо.

Когда вы используете .find() и когда .all(). Используете ли вы .find(), а затем .all()? Как долго?

Зависит от того, чего вы хотите достичь. В нашем приложении мы используем find() в маршруте приложения, затем либо all(), либо filter() в других маршрутах.

Имеет ли .all() срок истечения срока действия, чтобы через какое-то время он мог сделать новый запрос?

Неа. Он никогда не сделает новый запрос

Или он использует локальное хранилище, поэтому мне нужно его вручную очистить?

Он не использует локальное хранилище, записи хранятся в памяти. Так что, конечно, F5 очистит кеш.

Предположим, что у меня есть некоторые данные, которые я хотел бы обновлять только один раз в неделю? Как мне это сделать? Теперь каждый раз, когда я вхожу или повторно посещаю тот же маршрут, создается новый запрос. Как я могу избежать этого?

Итак, давайте предположим, что вы используете find() только в маршруте приложения, и этот пользователь сохраняет браузер открытым в течение 1 недели, и записи истекли. Есть много способов обновить, что легко/лучше зависит от того, все ли они истекают сразу или если они тайм-аут по одному.

  • У некоторых таймеров проверки устаревших записей и вызовов refresh() по мере необходимости.
  • У вас есть модель Ping, которую вы обновляете по определенному графику. Когда сервер реагирует на обновление, он может обойти любые измененные записи.
  • Или можно просто обновить браузер один раз в неделю (через window.location...)

Ответ 2

То, что вы называете кешем, - это содержимое магазина. Обычно есть два способа обновления хранилища, чтобы отразить изменения, сделанные на стороне сервера:

  • изменение происходит с взаимодействием/вызовом пользователя на сервер. Если вы обновляете записи mulitple на стороне сервера, вы можете отключить их с ответом на этот запрос.
  • изменение происходит асинхронно на стороне сервера (фоновое задание). Вы можете использовать websocket, чтобы направить эти изменения клиенту.