3

Ich entwickle eine Fakten-Fähigkeit für Alexa mit ihrer SpaceGeek-Vorlage. Die Vorlage selbst ist sehr geradlinig, aber ich versuche, es durch zu verbessern, um sicherzustellen, dass die verwendeten Fakten in derselben Sitzung nicht wieder auftauchen. Also ich löschen Sie das Element, nachdem es verwendet wird. Nun kommt es jedoch zu dem Problem, dass die in der Sitzung gelöschten Elemente in zukünftigen Sitzungen nicht mehr auftauchen. Also ich nehme an, dass die globale Variable im Backend bleibt und somit ein Kopier-Array wie unten erstellt. Aber es wird immer noch nicht funktionieren. Nachdem ich alle Fakten einmal verwendet habe, werde ich immer "Das sind alle Fakten, die wir für jetzt haben" bekommen. Selbst wenn ich eine neue Sitzung starte. Jede Hilfe wird geschätzt.Wie verwendet man sitzungsspezifische Variablen in Alexa Skills?

function handleNewFactRequest(response) { 
     var COPY_FACTS= SOME_FACTS.splice(0); 
     if(COPY_FACTS.length>0){ 
      var factIndex = Math.floor(Math.random() * COPY_FACTS.length); 
      var fact = COPY_FACTS[factIndex]; 

      // Create speech output 
      var speechOutput = "Here's your random fact: " + fact + " would you like more?"; 
      var repromptOutput = "would you like more random facts?"; 
      COPY_FACTS.splice(factIndex, 1); 
      response.ask(speechOutput, repromptOutput); 
     }else{ 
      var speechOutput = "That's all the facts we have for now."; 
      response.tell(speechOutput); 
     } 
    } 

Antwort

2

Der richtige Weg, dies zu behandeln, ist, Ihr Array als Sitzungsvariable und nicht als globales Objekt zu speichern. Ein Beispiel, das zeigt, wie dies im Detail ausgeführt wird, ist History Buff example skill, aber im Allgemeinen läuft der Prozess folgendermaßen ab:

Wenn Sie die erste Anfrage des Benutzers bearbeiten, erstellen Sie ein Objekt, das alle Variablen enthält, die Sie während der Sitzung beibehalten möchten und weisen Sie es session.attributes zu. Sie möchten Ihr Array als Eigenschaft für dieses Objekt speichern.

Dann können Sie in zukünftigen Ereignisprozeduren auf diese gespeicherten sitzungsspezifischen Variablen (z. B. Ihr Array) als Eigenschaften dieses session.attributes Objekts zugreifen.

Im verknüpften Beispiel enthalten sie in nachfolgenden Intent-Handlern das Snippet sessionAttributes = session.attributes, um einen bequemeren Zugriff auf diese Variablen bereitzustellen.

-1

Statt splice(0) der Verwendung des Arrays zu vervielfältigen, verwenden slice().

Die Funktion splice() ändert das ursprüngliche Array, wobei slice() dies nicht tut. See Sirko's response on this question.

+0

Dies funktioniert sogar schlechter als der OP-Code - da der Aufruf von 'splice()' keiner Variablen zugewiesen wird, würde das Ändern zu Aufruf von 'slice() 'dazu führen, dass er eine Kopie des Array mit entferntem Element, das sofort verlassen würde. –

+0

Mein Kommentar wurde nur auf die Codezeile gerichtet, die speziell 'splice (0)' verwendet, die 'var COPY_FACTS = SOME_FACTS.splice (0) war;' Diese Zeile in 'var COPY_FACTS = SOME_FACTS.slice() ändern;' würde Lösen Sie das Problem, dass das ursprüngliche Fakt-Array 'SOME_FACTS' leer wird. Ich hätte klarer sein sollen, – GregI

+0

Das ist fair, aber das würde in keiner Weise dazu führen, dass die entfernten Fragen zwischen den Antworten bestehen bleiben. Es löst das halbe Problem, aber nicht wirklich die wichtige Hälfte. –

Verwandte Themen