Допустим у меня есть класс, который может принимать и передавать по цепочке обработанное собой значение с задержкой 100 миллисекунд:
class Gate {
constructor(process) {
this.process = process
this.input = false
this.output = false
this.closed = false
this.value = 0
}
open() {
this.close = false
}
close() {
this.close = true
}
// эмитируем сигнал
emit(value) {
if (!this.closed && this.output) this.output.update(value)
}
// получаем значение от сигнала
update(value) {
if (!this.closed) {
// ожидание для обхода стека
setTimeout(_ => {
this.value = this.process(value !== undefined ? value : this.input.value)
// отправляем дальше по цепочке
this.emit(this.value)
}, 100)
}
}
// подключение входного объекта
connectInput(object) {
this.input = object
object.output = this
}
// подключение выходного объекта
connectOutput(object) {
this.output = object
object.input = this
}
}
Теперь пробуем сделать тактовый генератор на этой основе:
// пропускает сигнал без изменений
var a = new Gate(v => v)
// пропускает сигнал, инвертируя его
var b = new Gate(v => {
v = v ? 0 : 1
// вывод такта в консоль
console.log(v)
return v
}) // 0
// циклическая сеть
a.connectOutput(b)
b.connectOutput(a)
// запуск цикла
a.emit()
Генератор работает на ура, но теперь появилась одна проблема, к чему собственно и вел вопрос. При запуске цикла с объекта "a" его нельзя будет остановить, как бы я это не пытался сделать. Конечно же,
setTimeout асинхронный и последующие функции будут работать:
a.emit()
console.log('Ожидание старта цикла...')
// Ожидание старта цикла...
// 1
// 0
// 1...
Но дело в том, что я не могу вызвать методы у объектов "a" и "b":
a.emit()
a.close() // Попросту не работает
b.close() // Тоже ничего
Как решить этот, то ли баг, то ли моё незнание в процессах Node.js?