Как найти вызывающую функцию в строгом режиме

У меня есть функция getGames() в моем контроллере Angular, которая может быть вызвана как моей функцией init(), так и функцией update(). Мне нужно знать, init() или update() вызвали эту функцию, потому что я рассматриваю каждую ситуацию по-разному.

Я пытался получить доступ к arguments.callee.caller.toString(), но это не разрешено в строгом режиме, который является требованием для этого проекта.

Как я могу получить доступ к вызывающему абоненту getGames() в строгом режиме?

Моя текущая структура ниже. Очевидно, что loadingGames.promise внутри updateSchedule() не работает, потому что это обещание уже было разрешено, когда init() выполнялось. Я изо всех сил пытаюсь реорганизовать это так, чтобы init() и updateSchedule() зависели от разных разрешений обещаний в отношении одной и той же функции, getGames().

var loadingGames = $q.defer();

var getGames = function() {
  playersService.getGames({
    playerId: playerId
  }).$promise.then(function(data) {
    vm.games = data;
    loadingGames.resolve();
  });
};

var init = function() {
  getGames();
}

init();

var updateSchedule = function() {
  getGames();
  loadingGames.promise.then(function() {
    populateOptions(vm.games);
    vm.tableParams.reload();
  });
};

Моя мысль заключалась в том, чтобы определить caller в конце getGames(), а затем разрешить другое обещание в зависимости от того, кто был вызывающим абонентом.


person MattDionis    schedule 13.08.2015    source источник
comment
Это звучит очень похоже на то, что вы должны переосмыслить свой дизайн. Функция, которой нужно знать, кто ее вызвал, чтобы вести себя правильно, на самом деле не очень хорошая функция. Может быть, это должны быть просто две разные функции, которые, возможно, внутренне разделяют третью функцию, которую они используют для своей схожей логики?   -  person LionC    schedule 13.08.2015
comment
Эта функция является членом массива $q.all по отношению к функции init(). Есть около полдюжины асинхронных операций, которые необходимо выполнить, прежде чем моя функция init() сможет завершить работу. Однако после загрузки страницы пользователь может выполнять определенные действия, которые требуют только разрешения getGames() перед обновлением представления. Что я собираюсь сделать, так это разрешить различные обещания в зависимости от того, был ли init() вызывающим абонентом или update().   -  person MattDionis    schedule 13.08.2015
comment
Это по-прежнему звучит так, как будто вы пытаетесь сделать две разные вещи в одной функции. Поскольку ваши асинхронные операции возвращают промисы, в чем заключается проблема раскрытия/получения тех, для которых вы хотите разветвить специальное поведение? Только потому, что что-то ждет много обещаний, это не значит, что что-то другое не может ждать только одного из них   -  person LionC    schedule 13.08.2015
comment
@LionC, добавил подробности к моему первоначальному вопросу. Это моя текущая структура, и она лучше подчеркивает мои цели и, очевидно, текущую ошибку.   -  person MattDionis    schedule 13.08.2015


Ответы (1)


Ваша getGames()-функция может возвращать обещание, которое выполняется, как только игры будут загружены с сервера (чтобы сделать мой пример кода короче, я не указал параметр службы и предположил, что она возвращает обещание):

var games; //This is vm.games in your case

(function fetchGames() {
    games = playersService.getGames()
        .then(function(data){
            games = data;
            return data;
        });
})();

function getGames() {
    return $q.when(games);
}

function updateSchedule() {
    getGames()
        .then(function(theGames){
            populateOptions(theGames);
            tableParams.reload();
        });
}

$q.when(x) возвращает обещание, которое немедленно разрешается с помощью x, если x не Обещание. Если x является промисом, он возвращает x напрямую.

Просто примечание: ваши функции populateOptions и tableParam.reload очень похожи на ручные DOM-материалы. Это почти всегда неправильно в angular - пусть привязка данных сделает эту работу за вас.

person LionC    schedule 13.08.2015