2017-01-24 1 views
1

저는 javascript와 node.js에 익숙하지 않아이 범위 지정 문제를 파악하는 데 많은 어려움을 겪고 있습니다. 아래의 코드는 간단한 요청을하고 콘솔에 웹 페이지 본문을 표시합니다. 문제는 없습니다.javascript scoping : 다른 함수로 전달 된 함수에서 정보를 얻으려면 어떻게해야합니까?

function makeGETRequest(host, path, headers) { 
    var options = { 
     hostname: host, 
     port: 8000, 
     path: path, 
     method: 'GET', 
     headers: headers 
    }; 

    var request = http.request(options, function(response) { 
     response.on('data', function(body) { 
      console.log('Body: ' + body); 
     }); 
    }); 

    request.end(); 
} 

내가 할 수없는 것은 http.request 내에 선언 된 함수에서 정보를 얻지 못하는 것입니다. makeGETRequest()에서 선언 한 변수에 본문을 저장 한 다음 반환하려는 경우 범위를 벗어나므로 정의되지 않습니다. 전역 변수를 생성하고이를 대신 사용하면 문제가 해결되지 않습니다.

ex.

function makeGETRequest(host, path, headers) { 
     var siteBody; 
     var options = { 
     hostname: host, 
     port: 8000, 
     path: path, 
     method: 'GET', 
     headers: headers 
    }; 

    var request = http.request(options, function(response) { 
     response.on('data', function(body) { 
      console.log('Body: ' + body); 
      siteBody = body; //works as long as I don't exit the scope of the function 
     }); 
    }); 

    request.end(); 
    return body; //returns undefined 
} 

은 어떻게 makeGETrequest()의 정보를 사용하고 반환 할 수 있도록 내가 정보 몸을 얻거나, 그렇지 않으면 이러한 기능 중합니까?

+0

'var' 키워드가 없으면 변수의 전체 범위는 http://www.w3schools.com/js/js_scope.asp : Automatically Global입니다. 그러나 이것이 기능이 완료되었는지 보장하지는 않습니다. 콜백을 사용하거나 함수가 –

+0

을 실행했는지 확인하라'get '요청이 비동기 적이기 때문에 undefined를 반환하므로'return' 문이'siteBody = body; 앞에 실제로 실행될 것입니다. – avrahamcool

답변

0

asynchronous 자바 스크립트 기능 및 해결 방법에 대해 자세히 알아야합니다.

비동기 함수에서는 response을 변수에 할당하고 가져올 수 없습니다.

대신 promise을 사용해야합니다.

+2

왜 downvote입니까? 그는 옳다. –

+0

@ 토마스 설명이 필요없는 경우 설명하십시오. 설명은 필요하지 않습니다. 어떤 사람이 대답이 유용하지 않다고 생각하면, 그 의견에 대한 권리가 있습니다. – 4castle

+0

@Pritam 양질의 답변을 제공합니다. 문제와 해결책을 설명하십시오. 당신도 그 일을하지 않았습니다. – 4castle

관련 문제