TypeError:无法读取未定义的属性“ forEach”

时间:2020-11-09 12:55:27

标签: javascript node.js class

我将用JavaScript和Nodejs进行自我介绍。

我已经用构造函数创建了一个类。

在此构造函数中,每分钟执行一次cron作业。

cronjob从定义为类字段的Map中删除条目。

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工作正常,将每分钟执行一次。 无论出于什么原因,当我调用evictionRegisty Map的foreach方法时都会出现异常:

TypeError: Cannot read property 'forEach' of undefined

作为Java开发人员,我会说在调度功能的这个范围内没有Map。但是如果是这样,我如何访问地图?

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

是的,您不能访问函数中的变量,因为它不在范围内。

设置一个等于函数外部作用域的变量,并在函数内部使用它,就像这样:

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

答案 1 :(得分:0)

此错误表示“此”对象没有“ evictionRegisty”字段。这意味着它不是“信息”类。为了解决这个问题,您需要将变量作为输入传递给回调函数,或者在调用“ evictionRegisty”之前简单地松开“ 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)
   }
}