Функция не определена в setInterval в классе nodeJS и в switch / case - PullRequest
0 голосов
/ 28 февраля 2020

Я хотел создать класс, где я создаю интервал, используя функцию setInterval(), если определенная переменная имеет определенное значение. Как обработчик, я вставил предопределенную функцию, однако, при попытке запустить код, он говорит, что функция не определена. Вот код.

class Bot {
    i = 0;
    constructor() {
        switch (this.i) {
            case 0:
                this.interval = setInterval(this.foo, 1000);
                break;
        }
    }

    foo = () => {
        console.log("hi")
    };
    //Other Syntaxes I tried without luck:
    foo = function() {
        console.log("hi");
    }

    function foo() {
        console.log("hi");
    }
    foo() {
        console.log("hi");

    }
    //I also tried first defining the function, and then creating a constructor
}

РЕДАКТИРОВАТЬ: Я решил поделиться с вами полным кодом, однако я просто хотел бы добавить, что я знаю, что уже есть очень мощная библиотека, которая позволяет запускать Бот на Discord, но это о том, чтобы сделать это самостоятельно. Вот вам go:

class Bot {
  ws = new WebSocket('wss://gateway.discord.gg/?v=6&encoding=json');

  sequence = null;
  heartbeating;
  token;
  constructor(token) {
    this.token = token;
    this.ws.on('open', this.open);
    this.ws.on('message', this.incoming);
    this.ws.on('close', this.close);
  }
  open() {
    console.log("open");
  }
  incoming(payload) {
    var data = JSON.parse(payload);
    switch (data.op) {
      case 10:
        //This is the problematic line where I'm trying to enter the function.
        this.heartbeating = setInterval(this.heartbeat, data.d.heartbeat_interval);
        break;
      case 11:
        console.log("Heartbeat ACK");
        break;
      default:
        console.log(data);
    }
  }
  close(e){
    console.log(e);
  }

  heartbeat() {
    var payload = {
      op: 1,
      d: sequence
    }
    ws.send(JSON.stringify(payload));
  }
  identify(){
    //TODO identify with Discord
  }
}

Кроме того, я хочу извиниться за то, что не поделился с вами фактическим сообщением об ошибке: TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received undefined

Ответы [ 3 ]

0 голосов
/ 29 февраля 2020

You constructor слишком сложен и действительно оценивает то же самое, что я кодировал в constructor ниже - это потому, что i воля всегда инициализируется в 0 в момент, когда вызывается constructor , Что касается синтаксиса, то использование обычного метода класса должно помочь.

class Bot {
  i = 0;

  interval; //I like to explicitly declare the class members (tho not necessary)

  constructor() {
    this.interval = setInterval(this.foo, 1000);
  }

  foo() {
    console.log('foo called..');
  }
}

const b = new Bot();
0 голосов
/ 29 февраля 2020

Обработчик события был вызван из объекта WebSocket, поэтому ключевое слово this вернуло объект WebSocket, а не класс Bot. Обходной путь, который я еще не тестировал, может состоять в том, чтобы попытаться передать объект Bot в качестве параметра в прослушивателе событий, и если мне это удастся, я отредактирую этот ответ.

0 голосов
/ 28 февраля 2020
class Bot {
    i = 0;
    constructor() {
        switch (this.i) {
            case 0:
                this.interval = setInterval(this.foo, 1000);
                break;
        }
    }

    foo = function() {
        console.log("hi");
    }

}
const b = new Bot();

Это работает для меня. Но он начнет интервал сразу после создания экземпляра Object new Bot(); Если вы хотите контролировать интервал, вы можете сделать что-то вроде этого:

class Bot {
    i = 0;
    constructor() {
        switch (this.i) {
            case 0:
                this.startInterval = () => { this.interval = setInterval(this.foo, 1000); }
                break;
        }
    }

    foo = function() {
        console.log("hi");
    }

}
const b = new Bot(); // Creating new Object instance
b.startInterval(); // start intverval
setTimeout(() => {clearInterval(b.interval)}, 4000); // end interval after 4000 milsec 

Edit : полезная нагрузка ответа ws является объектом, поэтому нужно будет проанализировать payload.data вместо полезной нагрузки, например:

var data = JSON.parse(payload.data);

Я ничего не знаю о ws api gateway.discord.gg, так Вы должны использовать больше console.log, чтобы быть уверенным в том, с чем вы работаете.

...