AngularJs Ресурсосбережение / кеширование

0

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

Представьте себе, что у вас есть 5 директив, которым все они нуждаются в ресурсе

http://foo.com/accounts

Это возвращает json учетных записей (метод GEST API GET).

Какова наилучшая практика кэширования результата этого ресурса или сохранения его в переменной, а затем каждая директива получает данные из этой переменной и избегает попадания остального API более одного раза в 1 минуту (так что срок действия кеша истекает через 1 минуту)

Большое спасибо.

Теги:
rest

1 ответ

2
Лучший ответ

Есть несколько способов сделать это, но один простой автономный путь будет примерно таким:

app.factory('myFactory', function($http) {
  var THRESHOLD = 60000; // 60 seconds
  var request = null;
  var timestamp;

  var service = {
    getResource: function() {
      var now = new Date().getTime();

      // only make a request if we haven't made one yet
      // or if its been longer than 60 seconds since the last request
      if(request === null || timestamp && now - timestamp > THRESHOLD) {
        timestamp = now;
        request = $http.get('http://some.service.com/resource');
      }

      // we're always returning a promise, once its resolved any service that
      // calls getResource won't have to wait for the request unless its been
      // over 60 seconds since the last one.
      return request;
    }
  }

  return service;
});

Основная демонстрация здесь (слегка модифицирована для имитации HTTP-запроса): http://plnkr.co/edit/QncVlV?p=linter

  • 0
    Возможно ли каким-то образом сервис вернуть реальные данные, а не обещание? Я хочу в контроллере сделать это: $ scope.data = myFactory.getResource (); вместо myFactory.getResource (). then (function (data) {$ scope.data = data;});
  • 0
    Для этого вы можете настроить разрешение, если вы используете ui-router или ngRoute. Смотрите примеры здесь: odetocode.com/blogs/scott/archive/2014/05/20/…
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню