Nano Hash - криптовалюты, майнинг, программирование

Служба Angular кэширует значение

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

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

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) Я возвращаю выполненное обещание, когда значение кешируется, поэтому функция всегда возвращает обещание... также не уверен, что это необходимо, но думаю, что это не повредит.


  • Так в чем же проблема? 02.01.2015
  • Это было указано в вопросе прямо под кодом. Я переместил часть вопроса выше кода 02.01.2015
  • Проверил другие подобные вопросы? stackoverflow.com/ вопросы/15100020/ 02.01.2015
  • Вы нигде не изложили вопрос. Это уже совершенно ясно по отсутствию вопросительного знака. Однако, если вы не получаете попадание в кеш, это может быть просто потому, что Config._currentYear не присваивается какое-либо значение до тех пор, пока не будут выполнены оба вызова (т. е. тогда функция then() возвращает обещание, поэтому оба вызова могут быть уже в Parse.Config.get() до присваивается новое значение.) 03.01.2015
  • @ochi в предложенном дубликате, похоже, ответ заключается в том, что кэшированное значение теряется при перезагрузке страницы. Мое приложение использует угловую маршрутизацию, и проблема возникает без перезагрузки страницы. 03.01.2015
  • @dirkk добавил вопросительный знак. Кроме того, поскольку я вижу сообщение в журнале, указывающее, что значение кэшировано, я не думаю, что проблема вызвана состоянием гонки, слишком ранним повторным запуском get(). 03.01.2015

Ответы:


1

Вместо кэширования данных, почему бы вам просто не кэшировать обещание и не вернуть его. Когда вы кэшируете данные, вы устанавливаете данные 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");
        });
    };
});
02.01.2015
  • 1) спасибо за ответ, 2) отличная идея кэшировать обещание, чтобы избежать состояния гонки (я собираюсь использовать это и в других местах), 3) я только что обнаружил, что моя проблема связана с сервером adobe скобки nodejs (когда я запускал один вручную, он работал), но я собираюсь отметить это правильно, так как это полезно (и не педантично ставить вопросительные знаки в вопросе). 03.01.2015
  • @user1272965 user1272965 Добро пожаловать. Рад, что чем-то помог. Еще одна вещь, которую вы можете добавить, это аннулировать кешированное обещание в блоке catch. Просто чтобы вы не всегда хранили невыполненное обещание в кеше. И да, кеширование обещания уменьшает количество строк кода, которое в противном случае вам придется делать при кэшировании данных, ведь обещание — это просто прокси для данных. 03.01.2015
  • @user1272965 user1272965 Извините, если вы думаете, что я (и другие) проявляю педантичность. Вам может показаться, что это так, но это просто потому, что мы провели ряд опытов, когда люди не совсем ясно спрашивали, в чем их проблема, и люди тратили (бесполезно) время на решение проблемы, которой не существовало. Так что быть очень ясным здесь вселяет надежду, и я надеюсь, что вы не предвзято относитесь к сообществу SO. Но я рад, что PSL тоже посчитала, что суть проблемы в гонках :) 03.01.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..