Я получаю сообщение об ошибке Maximum call stack size exceeded
из функции save()
. Функция вызывает JSON.stringify()
в массиве, который содержит экземпляры другого класса:
this.tasks[taskData.jobID] = new TASK(taskData, () => {
console.log('Task done', taskData.jobID);
delete this.tasks[taskData.jobID];
});
save() {
const getCircularReplacer = () => {
debug('starting circular replacer');
// closure
const seen = new WeakSet();
return (key, value) => {
if (typeof value === 'object' && value !== null) {
if (seen.has(value)) {
return;
}
seen.add(value);
}
return value;
};
};
const newState = JSON.stringify(this.tasks, getCircularReplacer());
const newStateHash = hash.h32(newState, 0xABCD).toString(16);
if (newStateHash !== this._previousStateHash) {
debug('writing to persistance file', process.env.PERSISTENCE_FILE);
fs.writeFileSync(process.env.PERSISTENCE_FILE, newState);
this._previousStateHash = newStateHash;
}
}
Функция вызывается каждую секунду с setInterval()
из другой функции restore()
, которая, в свою очередь, вызываетсяэто конструктор класса. Я включил полную функцию здесь , если это необходимо.
this.saveTimer = setInterval(() => {
debug('Calling save()');
for (const id in this.tasks) {
if (moment().isAfter(this.tasks[id].finishTime)) clearInterval(this.saveTimer);
}
this.save();
}, 1000);
Кажется, проблема в объекте toJSON()
в классе TASK()
. Я не вижу, что может вызвать проблему, у меня нет никаких рекурсивных вызовов функций здесь и setInterval()
очищается. Функция toJSON()
выглядит следующим образом:
toJSON() { // * custom object to write to the .persistance file
return {
taskData: this.taskData,
_handler: this._handler,
_timer: this._timer, // TODO: store the clock time and reload timeout properly
machineState: this.machineState,
};
}