soiran
@soiran
Разработчик, Художник

Как обойти ожидание цепочки вызова методов?

Допустим у меня есть класс, который может принимать и передавать по цепочке обработанное собой значение с задержкой 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?
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
Похоже, что есть опечатка:

open() {
        this.close = false
    }

    close() {
        this.close = true
    }


Должно быть closed, судя по всему
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы