如何在严格模式下查找函数调用者

时间:2015-08-13 11:22:11

标签: javascript angularjs strict

我的Angular控制器中有一个函数getGames(),我的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(),然后根据来电者是谁来解决不同的承诺。

1 个答案:

答案 0 :(得分: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();
        });
}
如果x不是承诺,

$q.when(x)会返回一个立即使用x解决的承诺。如果x是承诺,则会直接返回x

请注意:您的populateOptionstableParam.reload函数看起来很像手工DOM的东西。角度几乎总是错误的 - 让数据绑定为你完成这项工作。