Wywołania zwrotne

W interaktywnym obszarze roboczym możesz zaimplementować te wywołania zwrotne:

onUpdate()

onUpdate()Wywołanie zwrotne przekazuje dane z webhooka do aplikacji internetowej, aby odpowiednio zaktualizować aplikację internetową. Tego wywołania zwrotnego należy używać tylko w przypadku modelu realizacji interaktywnego obszaru roboczego po stronie serwera.

Więcej informacji o onUpdate() znajdziesz w artykule Aktualizacja danych karty.

onTtsMark()

Wywołanie zwrotne onTtsMark() jest wywoływane, gdy niestandardowe tagi <mark> zawarte w języku syntezy mowy (MLML) są odczytywane użytkownikowi podczas zamiany tekstu na mowę. onTtsMark() można stosować zarówno w modelach programowania po stronie serwera, jak i po stronie klienta.

W poniższych fragmentach onTtsMark() synchronizuje animację aplikacji internetowej z odpowiednimi danymi wyjściowymi TTS. Gdy akcja powie użytkownikowi „przegrana”, aplikacja internetowa przeliteruje odpowiednie słowo i wyświetli litery użytkownikowi.

W tym przykładzie moduł obsługi webhooka revealWord w odpowiedzi na żądanie użytkownika zawiera niestandardowy znak:

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());
});
…
    

Ten fragment kodu rejestruje wywołanie zwrotne onTtsMark(), sprawdza nazwę znaku i wykonuje funkcję revealCorrectWord(), która aktualizuje aplikację internetową:

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()

Wywołanie zwrotne onInputStatusChanged() powiadamia o zmianie stanu wprowadzania danych w interaktywnym działaniu obszaru roboczego. Zmiany stanu wprowadzania wskazują, kiedy mikrofon jest otwierany i zamykany lub gdy Asystent przetwarza zapytanie. Te zdarzenia mogą spowodować zmianę stanu danych wejściowych:

  • Działanie użytkownika mówiącego
  • Użytkownik wpisuje tekst w wyszukiwarce Google na Androida.
  • Aplikacja internetowa korzystająca z interfejsu API sendTextQuery() do wysyłania zapytań tekstowych do działania
  • Zapisywanie akcji w pamięci domowej i innych wydarzeniach Asystenta

Głównym przypadkiem użycia tego wywołania zwrotnego jest synchronizowanie akcji z interakcjami głosowymi użytkownika. Jeśli na przykład użytkownik gra w Interaktywną grę Canvas i otwiera mikrofon, możesz wstrzymać grę w czasie, gdy mówi. Możesz też poczekać, aż mikrofon będzie otwarty, i wysłać zapytanie tekstowe do Asystenta, żeby się upewnić, że je otrzyma.

Ten interfejs API zgłasza te stany:

  • LISTENING – oznacza, że mikrofon jest otwarty.
  • IDLE – oznacza, że mikrofon jest zamknięty.
  • PROCESSING – wskazuje, że Asystent obecnie wykonuje zapytanie, a mikrofon jest zamknięty.

Za każdym razem, gdy zmieni się stan, interfejs API raportuje stan działania.

Mimo że możliwe jest przejście między stanami, to pewne częste wzorce:

  • IDLE>LISTENING>PROCESSING>IDLE – użytkownik wydaje zapytanie, zapytanie jest przetwarzane, a mikrofon się zamyka.
  • IDLE>PROCESSING>IDLE – aplikacja internetowa używa interfejsu API sendTextQuery() do wysyłania zapytania tekstowego do działania.
  • IDLE>LISTENING>IDLE – użytkownik otwiera mikrofon, ale nie wydaje zapytania.

Aby używać tej funkcji w akcji, dodaj do kodu aplikacji internetowej onInputStatusChanged(), jak widać w tym fragmencie kodu:

onInputStatusChanged(inputStatus) {
   console.log("The new input status is: ", inputStatus);
}

Wywołanie onInputStatusChanged() zwraca jeden parametr enum: inputStatus. Możesz sprawdzić tę wartość, by sprawdzić obecny stan danych wejściowych. inputStatus może mieć wartość LISTENING, PROCESSING lub IDLE.

Następnie dodaj do obiektu callbacks obiekt onInputStatusChanged(), aby go zarejestrować, jak pokazano w tym fragmencie kodu:

 /**
  * 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);
 }
}