3

私は自分のSpaceGeekテンプレートを使ってAlexaのファクトスキルを開発しています。 テンプレート自体は非常に単純ですが、私は で改善しようとしています。使用された事実が同じセッションで再び現れないようにしています。そこで、私は 要素を使用した後に要素を削除します。しかし、今度は、セッションで削除された要素は、今後のセッションでは登場しないという問題があります。 したがって、グローバル変数はバックエンドにとどまり、以下のようにコピー配列を作成すると仮定します。しかし、それはまだ動作しません。だから、すべての事実を一度使った後、私はいつも「これは私たちが今持っているすべての事実です。新しい セッションを開始してもどんな助けもありがとう。Alexa Skillsでセッション固有の変数を使用する方法は?

答えて

2

これを正しく処理する方法は、配列をグローバルオブジェクトではなくセッション変数として保存することです。これを詳細に行う方法を示す例は、History Buff example skillですが、一般的に言えば、プロセスは次のようになります。

ユーザーの最初の要求を処理するときに、セッション全体で維持する変数を含むオブジェクトを作成しますsession.attributesに割り当てます。そのオブジェクトにプロパティとして配列を格納したいと思うでしょう。

将来のイベントハンドラでは、格納されたセッション固有の変数(つまり配列)に、session.attributesオブジェクトのプロパティとしてアクセスすることができます。

リンクされた例では、後続のインテントハンドラで、それらの変数にアクセスするためのより便利なハンドルを提供するためにスニペットsessionAttributes = session.attributesが含まれています。

-1
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); 
     } 
    } 

代わりのアレイ、使用slice()を複製するsplice(0)を使用。

splice()関数は元の配列を変更します。ここでは、slice()はありません。 See Sirko's response on this question

+0

これはOPのコードよりも悪くなります。 'splice()'の呼び出しが変数に割り当てられていないので、 'slice()'を呼び出すように変更すると、直ちに放棄される要素が削除された配列。 –

+0

私のコメントは、 'splice(0)'を 'var COPY_FACTS = SOME_FACTS.splice(0);'としたコード行のみを対象としていました。この行を 'var COPY_FACTS = SOME_FACTS.slice();'に変更すると、オリジナルのファクト配列 'SOME_FACTS'が空になる問題を解決してください。私はより明確になっているはずです – GregI

+0

それは公正ですが、これは決して削除された質問を応答の間に持続させるものではありません。それは問題の半分を解決しますが、重要な半分は実際には解決しません。 –

関連する問題