Почему обратный вызов JavaScript вызывается только после регистрации?

Я делаю игру с использованием фазера. Я использую Web Speech API для преобразования текста в речь. Это часть моего кода:

Функция, которую я написал для использования Web Speech API:

Game.speech = window.speechSynthesis;
Game.speak = function(s, cb) {
    var text = new SpeechSynthesisUtterance(s);
    text.pitch = 0.3;
    text.rate = 0.75;
    if (cb) {
        text.onend = cb;
    }
    Game.speech.speak(text);
}


Код (в другом объекте), который использует функцию:

setTimeout(() => Game.speak(this.introText, this.enterShip.bind(this)), 3000);


Я заметил две вещи, которые мешают мне:
Во-первых, если я не использую bind функция с обратным вызовом, переданным Game.speakкод выполняется, но, очевидно, возвращает ошибку из-за измененного контекста.
Во-вторых, если я использую bind функция обратного вызова не запускается.
Поэтому я попытался зарегистрировать обратный вызов, чтобы убедиться, что он был там, вот так:

if (cb) {
    text.onend = cb;
    console.log(text.onend);
}

Код работал нормально! Так что это, очевидно, работает, но я хочу убедиться, почему. Почему мой обратный вызов вызывается только когда я его регистрирую?

0 ответов

Другие вопросы по тегам