2015-01-02 3 views
5

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

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

angular.module('myApp.services').factory('Config', function() { 

    var Config = { }; 

    Config.currentYear = function() { 
     if (Config._currentYear) { 
      // sadly, we never execute here 
      console.log("returning cached year"); 
      return Parse.Promise.as(Config._currentYear); 
     } 
     return Parse.Config.get().then(function(config) { 
      console.log("caching year"); 
      Config._currentYear = config.get("currentYear"); 
      return Config._currentYear; 
     }); 
    }; 

    return Config; 

}); 

Пары отмечает: (1) Я назвал кэшированный атрибут _currentYear, добавив подчеркивание, чтобы избежать столкновений с именем функции. Не уверен, что мне нужно это сделать. (2) Я возвращаю выполненное обещание, когда значение кэшируется, поэтому функция всегда возвращает обещание ... также не уверен, что это необходимо, но цифра не может повредить.

+2

Так в чем же проблема? – dfsq

+0

Его было указано в вопросе прямо под кодом. Я переместил вопрос на код выше – user1272965

+0

Проверял другие подобные вопросы? http://stackoverflow.com/questions/15100020/using-angular-service-to-share-data-between-controllers – ochi

ответ

3

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

angular.module('myApp.services').factory('Config', function() { 
    var config; //Just use to save the promise 
    Config.currentYear = function() { 
     /*If there is already a call made before return the promise else 
      make the actual call and store the promise in the variable.*/ 
     return config || config = Parse.Config.get().then(function(config) { 
      return config.get("currentYear"); 
     }); 
    }; 
}); 
+2

1) спасибо за ответ, 2) отличная идея, чтобы скрыть обещание избежать условия гонки (я тоже буду использовать это в других местах), 3) я только что обнаружил, что моя проблема связана с крепежными скобками nodejs сервер (когда я запускал один из них вручную, он работал), но я собираюсь отметить это правильно, так как он полезен (а не педантичен по поводу размещения вопросительных знаков в вопросе). – user1272965

+0

@ user1272965 Добро пожаловать. Рад, что это помогло. Еще одна вещь, которую вы можете добавить, - аннулировать обещание с кешем в блоке catch. Только так вы не всегда держите неудавшееся обещание в кеше. И да, кеширование обещаний уменьшает количество выровненных кода, которые в противном случае вам придется делать при кешировании данных, ведь обещание - просто прокси для данных. – PSL

+0

@ user1272965 Прошу прощения, если вы думаете, что я (и другие) педантичен. Это может показаться вам так, но это просто потому, что мы сделали много опытов, когда люди не совсем поняли, спрашивают, какова их проблема, и люди тратят (бесполезное) время на решение проблемы, которой не было. Таким образом, я здесь очень надеюсь, и надеюсь, что вы не будете предвзято относиться к сообществу SO. Но я рад, что PSL также подумал, что состояние гонки является ядром проблемы :) – dirkk

Смежные вопросы