Ошибка типа: не удается прочитать свойство ‘forEach’ неопределенного

#javascript #node.js #class

#javascript #node.js #класс

Вопрос:

Я представляюсь в JavaScript и Nodejs.

Я создал класс с конструктором.

Внутри этого конструктора задание cron выполняется каждую минуту.

Cronjob удаляет записи из карты, которая определена как поле класса.

 class Infos{

static TEN_SECS = 10000;

static cron = require('node-cron');

static codeMap = new Map();
static evictionRegisty = new Map();

constructor() {
    console.log('Create repo!');
    //Run each minute
    cron.schedule('* * * * *', function() {
        console.log('Scheduler executed!');
        this.evictionRegisty.forEach((key, value, map) => {
            if (key > Date.now() - TEN_SECS){
                this.codeMap.delete(value);
                this.evictionRegisty.delete(key);
                console.log('Remove k/v ='   key   '/'  value)
            }
        });
    });
};
  

cronjob работает нормально и будет выполняться каждую минуту.
По какой-либо причине возникает исключение, когда я вызываю метод foreach карты evictionRegisty:

 TypeError: Cannot read property 'forEach' of undefined
  

как разработчик Java, я бы сказал, что в этой области функции schedule нет Map . Но если это так, как я могу получить доступ к карте?

Спасибо за вашу помощь

Комментарии:

1. попробуйте использовать функцию со стрелкой вместо анонимной функции внутри планировщика. здесь —> cron. расписание(‘* * *’,()=>{ ваш код})

Ответ №1:

Вы правы, вы не можете получить доступ к переменной внутри функции, потому что она находится вне области видимости.

Установите переменную, равную области видимости за пределами функции, и используйте ее, пока вы находитесь в своей функции, вот так:

 class Infos{

static TEN_SECS = 10000;

static cron = require('node-cron');

static codeMap = new Map();
static evictionRegisty = new Map();

var root = this;

constructor() {
    console.log('Create repo!');
    //Run each minute
    cron.schedule('* * * * *', function() {
        console.log('Scheduler executed!');
        root.evictionRegisty.forEach((key, value, map) => {
            if (key > Date.now() - TEN_SECS){
                this.codeMap.delete(value);
                this.evictionRegisty.delete(key);
                console.log('Remove k/v ='   key   '/'  value)
            }
        });
    });
};
  

Ответ №2:

Эта ошибка означает, что у объекта ‘this’ нет поля ‘executionregisty’. Это означает, что это не класс ‘Infos’. Чтобы решить эту проблему, вам нужно передать переменные в качестве входных данных в функцию обратного вызова или просто потерять ‘this’ перед вызовом ‘evictionRegisty’. Ваш цикл будет:

 evictionRegisty.forEach((key, value, map) => {
   if (key > Date.now() - TEN_SECS){
          this.codeMap.delete(value);
           this.evictionRegisty.delete(key);
           console.log('Remove k/v ='   key   '/'  value)
   }
}