javascript
  • node.js
  • aws-lambda
  • alexa-skills-kit
  • 2017-12-29 46 views 1 likes 
    1

    내가 만든 API와 내가 만든 API를 읽는 알렉사 스킬. API는 잘 작동하고 그대로 람다를 사용하여 Alexa 스킬에서 null 응답 받기

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

    내가 다음 코드

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

    콘솔 출력

    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을 반환 한 반환 .

    다른 사람의 주석을 제거하고 주석을 제거하면 <speak> The session will be</speak>이 반환됩니다.

    나는 스코프와 관련이 있다고 생각하지만, 왜 텍스트가 로그 b에서는 정확하지만 d에서는 그렇지 않은지에 대해 생각할 수 없다. 내가이 울퉁불퉁 한 곳에서 this.emit을 사용할 수 없다면, 끝에서 사용할 정보를 거기에서 얻는 방법이 필요하다.

    답변

    1

    당신이 고생하는 이유는 비동기 함수 때문입니다. https.get은 비동기 함수로 코드 실행을 시작하고 https.get이 응답을 반환하면 콜백 함수가 실행됩니다. 이상적으로는 응답으로 무엇을하고 싶은지는 콜백 함수 내부에 있어야합니다.

    텍스트 변수의 원래 값은 The session will be입니다. 그런 다음 https.get을 실행하고 비동기가 https.get 다음에 다른 코드 행을 실행하고 console.log("d" + text);을 실행합니다. 텍스트 값은 변경되지 않고 이전 값을 인쇄합니다. 이제 https.get은 성공적인 응답을 반환하고 콜백을 트리거하고 이제는 텍스트 값이 변경되어 은 새 값을 봅니다.

     관련 문제

    • 관련 문제 없음^_^