Вы можете реализовать следующие обратные вызовы в своем действии Interactive Canvas:
 onUpdate()
 Обратный вызов onUpdate() передает данные из вашего веб-перехватчика в ваше веб-приложение для соответствующего обновления веб-приложения. Этот обратный вызов следует использовать только с моделью выполнения на стороне сервера при разработке Interactive Canvas.
 Дополнительные сведения о onUpdate() см. в разделе Передача данных для обновления веб-приложения .
 onTtsMark()
 Обратный вызов onTtsMark() вызывается, когда пользовательские теги <mark> , включенные в язык разметки синтеза речи ( SSML ) вашего ответа, считываются пользователю во время преобразования текста в речь (TTS). Вы можете использовать onTtsMark() как в моделях разработки выполнения на стороне сервера, так и на стороне клиента.
 В следующих фрагментах onTtsMark() синхронизирует анимацию веб-приложения с соответствующим выводом TTS. Когда Действие говорит пользователю: «Извините, вы проиграли», веб-приложение произносит правильное слово и отображает буквы пользователю.
 В следующем примере обработчик веб-перехватчика revealWord включает специальную пометку в ответ пользователю, когда он проиграл игру: 
JavaScript
… app.handle('revealWord', conv => { conv.add(new Simple(`<speak>Sorry, you lost.<mark name="REVEAL_WORD"/> The word is ${conv.session.params.word}.</speak>`)); conv.add(new Canvas()); }); …
 Следующий фрагмент кода затем регистрирует обратный вызов onTtsMark() , проверяет имя метки и выполняет функцию revealCorrectWord() , которая обновляет веб-приложение: 
JavaScript
… setCallbacks() { // declare Assistant Canvas Action callbacks const callbacks = { onTtsMark(markName) { if (markName === 'REVEAL_WORD') { // display the correct word to the user that.revealCorrectWord(); } }, } callbacks.onUpdate.bind(this); } …
 onInputStatusChanged()
 Обратный вызов onInputStatusChanged() уведомляет вас, когда статус ввода изменяется в вашем действии интерактивного холста. Изменения состояния входа указывают на то, когда микрофон открывается и закрывается или когда Ассистент обрабатывает запрос. Следующие события могут привести к изменению состояния входа:
- Пользователь, говорящий с вашим действием
- Пользователь вводит текст в приложении Google Search для Android (AGSA).
-  Веб-приложение, использующее API sendTextQuery()для отправки текстового запроса в действие.
- Запись действий в домашнее хранилище и другие события Ассистента.
Основной вариант использования этого обратного вызова — синхронизация вашего действия с голосовым взаимодействием пользователя. Например, если пользователь играет в игру Interactive Canvas и открывает микрофон, вы можете приостановить игру, пока пользователь говорит. Вы также можете подождать, пока микрофон откроется, чтобы отправить текстовый запрос Ассистенту, чтобы убедиться, что он получен.
Этот API сообщает о следующих статусах:
-  LISTENING— указывает на то, что микрофон открыт.
-  IDLE— указывает на то, что микрофон закрыт.
-  PROCESSING– указывает, что Ассистент в данный момент выполняет запрос, а микрофон закрыт.
API сообщает статус ввода вашему действию каждый раз, когда статус меняется.
Хотя возможен любой переход между состояниями, распространены следующие потоки:
-  IDLE>LISTENING>PROCESSING>IDLE— пользователь произносит запрос, запрос обрабатывается, и микрофон закрывается.
-  IDLE>PROCESSING>IDLE— веб-приложение использует APIsendTextQuery()для отправки текстового запроса в действие.
-  IDLE>LISTENING>IDLE— пользователь открывает микрофон, но не произносит вопрос.
 Чтобы использовать эту функцию в своем действии, добавьте onInputStatusChanged() в код вашего веб-приложения, как показано в следующем фрагменте:
onInputStatusChanged(inputStatus) {
   console.log("The new input status is: ", inputStatus);
}
 Обратный вызов onInputStatusChanged() передает обратно один параметр перечисления inputStatus . Вы можете проверить это значение, чтобы увидеть текущий статус входа. inputStatus может быть LISTENING , PROCESSING или IDLE .
 Затем добавьте onInputStatusChanged() к объекту callbacks , чтобы зарегистрировать его, как показано в следующем фрагменте:
 /**
  * Register all callbacks used by the Interactive Canvas Action
  * executed during game creation time.
  */
 setCallbacks() {
   const that = this;
   // Declare the Interactive Canvas action callbacks.
   const callbacks = {
     onUpdate(data) {
       console.log('Received data', data);
     },
     onInputStatusChanged(inputStatus) {
       console.log("The new input status is: ", inputStatus);
     },
   };
   // Called by the Interactive Canvas web app once web app has loaded to
   // register callbacks.
   this.canvas.ready(callbacks);
 }
}
