Как предотвратить одновременное выполнение функции в AngularJS? - PullRequest
0 голосов
/ 07 января 2020

Новичок ie до JavaScript.

У меня есть эта функция, которая получает кэшированный ресурс, и если он не находится в кеше, он вызывает back-end для этого ресурса.

Однако функция вызывается дважды, оба раза сразу после входа в систему. В результате к бэкэнду отправляются два абсолютно одинаковых запроса, так как ресурс еще не кэшируется ко времени второго выполнения функции. Функция вызывается разными модулями, но модули находятся в одном сервисе.

Есть ли способ «предотвратить» выполнение функции еще раз, если предыдущее выполнение еще не закончилось?

В моем случае я думаю, что это можно сделать в двух местах - если это возможно:

function doSomething() {

    return getCachedData()
        .catch(function() {
            return getData()
              .then(saveDataToCache);
        });
}

или:

function getData() {

    var deferred = $q.defer();

    $http.get('https://www.example.com')
        .then(function(response) {
            deferred.resolve(response.data);
        })
        .catch(function() {
            deferred.reject();
        });

    return deferred.promise;
}

1 Ответ

0 голосов
/ 08 января 2020

Так у меня как-то так сработало:

var dataPromise;

function getData() {

    if (dataPromise === null) {
        dataPromise = $http.get('https://www.example.com/api/'))
            .then(function(response) {
                return response.data;
            })
            .catch(function() {
                return $q.reject();
            });

        return dataPromise;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...