JSON.stringify () - Максимальный размер стека вызовов превышен в Date.toJSON - PullRequest
0 голосов
/ 08 ноября 2019

Я получаю сообщение об ошибке 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,
    };
  }
...