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

How to find function caller while in strict mode

我的 Angular 控制器中有一个函数 getGames(),我的 init() 函数和 update() 函数都可以调用它。我需要知道是 init() 还是 update() 调用了这个函数,因为我对每种情况的处理方式不同。

我尝试访问 arguments.callee.caller.toString(),但在严格模式下不允许这样做,这是该项目的要求。

如何在严格模式下访问 getGames() 的调用者?

我目前的结构如下。显然 updateSchedule() 中的 loadingGames.promise 不起作用,因为当 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();
  });
};

我的想法是确定 getGames() 末尾的 caller,然后根据调用者是谁解决不同的承诺。

您的 getGames()-函数可以 return 一个一旦从服务器获取游戏就解决的承诺(为了使我的示例代码更短,我省略了服务的参数并假设它 return 是一个承诺):

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) return 如果 x 不是承诺,则立即用 x 解决的承诺。如果 x 是一个承诺,它 return 直接 x

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