#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)
}
}