Есть свойство caller, но в typescript почему то не получается применить https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/caller
Делаю как то так
export class Shoot extends State {
shoot(point: PIXI.Point, state: string) {
console.log(this.shoot.caller);
this.playerComponents.network.socket.emit('touche', point);
this.playerComponents.changeState(this.playerComponents.states[state]);
}
}
Изначальная задача понять из какого класса был вызван метод и перейти в предыдущее состояние, для этого просто передаю строкой имя класса.
Пример того как вызывается функция
export class Move extends State {
timer: any;
move(input: number) {
clearTimeout(this.timer);
this.playerComponents.network.socket.emit('Input', input);
this.timer = setTimeout(() => {
this.playerComponents.changeState(this.playerComponents.states.Idle);
}, 500);
}
shoot(point: PIXI.Point) {
this.playerComponents.network.socket.emit('Input', 0);
this.playerComponents.changeState(this.playerComponents.states.Shoot);
this.playerComponents.state.shoot(point,'Move');
}
}
.....
states: any = {
'Idle' : new Idle(this),
'Move' : new Move(this),
'Shoot': new Shoot(this),
'Build': new Build(this),
};
.....
Минимальный пример
this.playerComponents.state.shoot(point,'Move');
Это работать не будет, потому что
Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
"use strict";
function f() { return f.caller }
function g() { return f() }
g()
Правильно делать так, чтобы это не требовалось.
Возможно, стоит глянуть паттерн Шаблонный метод.
Если caller нужен для какого-то логирования, то можно попытаться распарсить стек вызовов из new Error().stack
"use strict";
function f() { return new Error().stack }
function g() { return f() }
console.log(g())
В общем нашел ответ оказывается если вывести в консоль arguments просто вот так вот
shoot(point: PIXI.Point, state: string) {
console.log(arguments);
this.playerComponents.network.socket.emit('touche', point);
this.playerComponents.changeState(this.playerComponents.states[state]);
}
То все становится очевидным дальше добираемся до caller https://stackoverflow.com/questions/280389/how-do-you-find-out-the-caller-function-in-javascript
Хотя думал что будет undefined, пока не проверил
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости