Предотвращение дублирования инициализации асинхронных служб в Angular.js

0

У меня есть служба Angular.js, которая дает свои результаты асинхронно, оглядываясь на некоторое время, основной шаблон для этого, похоже, использует обещания $ q, подобные этому

angular.module('fooApp').factory('foo', function ($q) {

    var result;

    function build() {
        var d = $q.defer();
        longAsyncInit(function(data) {
            result = data;
            d.resolve(result);
        });
        return d.promise; 
    };

    return {
        get: function () {
            if (result) {
                return $q.when(result);
            } else {
                return build();
            }
        }
    }
});

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

angular.module('fooApp').factory('foo', function ($q) {

    var result
    var d;

    function build() {
        d = $q.defer();
        longAsyncInit(function(data) {
            result = data;
            d.resolve(result);
        });
        return d.promise; 
    };

    return {
        get: function () {
            if (result) {
                return $q.when(result);
            } else if (d) {
                return d.promise;
            } else {
                return build();
            }
        }
    }
});

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

Теги:
asynchronous

1 ответ

0

Вы ищете метод debounce для решения проблемы.

Из документации библиотеки Underscore, что _.debounce() делают

Создает и возвращает новую отлаженную версию переданной функции, которая отложит ее выполнение до тех пор, пока не истечет миллисекунды ожидания с момента последнего вызова. Полезно для реализации поведения, которое должно произойти только после того, как вход остановился. Например: рендеринг предварительного комментария Markdown, пересчет макета после того, как окно перестало изменяться, и так далее.

Ещё вопросы

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