2017-12-29 34 views
1

私が作成しようとしているアレクサのスキルは、私が作成したAPIを読み込みます。 APIが正常に動作してラムダを使用してAlexaスキルからnullレスポンスを取得

{ 
"_id": "5a4523104494060cf097c1ad", 
"description": "Sprinting", 
"date": "2017-12-29" 
} 

を返して、私は次のコード

そのままコンソール出力

2017-12-29T09:33:47.493Z  dThe session will be 
2017-12-29T09:33:47.951Z  aThe session will be 
2017-12-29T09:33:47.952Z  c The session will be 
2017-12-29T09:33:48.011Z  bThe session will beSprinting 

は、しかし、これはthis.emit機能のためにnullを返している

'getNext': function() { 
    var url = '***API ADDRESS*** '; 
    var text = "The session will be"; 

    https.get(url, function(response) { 
     var body = ''; 

     response.on('data', function(x) { 
      body += x; 

     }); 
     console.log("a" + text); 
     response.on('end', function() { 
      var json = JSON.parse(body); 

      text += json.description; 
      console.log("b" + text); 
      this.emit(":tell", text); 
     }); 
     console.log("c " + text); 
    }); 
    console.log("d" + text); 

    // this.emit(":tell", text); 
} 

を持っています。

私はそれをコメントし、他のコメントを外すと <speak> The session will be</speak>が返されます。

私はスコープとは関係がありますが、なぜテキストがログbで正しいのですが、dでは正しくないと思うと思います。もし、私がこの共鳴音でこのエミットを使うことができなければ、最後に使用する情報をそこから得る方法が必要です。

答えて

1

あなたが立ち往生している理由は、非同期機能のためです。 https.getは非同期関数で、コードが実行され、https.getが応答を返したときにコールバック関数が実行されます。理想的には、レスポンスで何をしたいのかは、コールバック関数内にあるべきです。

テキスト変数の元の値はThe session will beです。その後、https.getを実行し、その非同期はhttps.getの後に他のコード行を実行し、console.log("d" + text);を実行します。テキストの値は変更されず、古い値を出力します。 https.getは応答が成功し、コールバックを開始し、テキスト値が変更されるようになりました。console.log("b" + text);は新しい値を表示します

関連する問題