2014-10-31 2 views
0

나는 노드를 배우려고하는데 어려움을 겪고있다. API를 호출 한 다음 데이터를 반환하려는 Super Simple Weather App을 작성 중입니다.함수 외부에서 변수를 사용하는 것

하지만 콘솔에이 데이터를 반환하지 않는 이유는 무엇입니까?

var request = require('request'); 

request('https://api.forecast.io/forecast/{API KEY}/42.47994,-83.13040', function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     //var info = JSON.parse(body); 
     var jsonObject = JSON.parse(body); 
     var summary = jsonObject.currently.summary; 
     var temp = jsonObject.currently.temperature; 
     var realFeel = jsonObject.currently.apparentTemperature; 
     var summary2 = jsonObject.hourly.summary; 
     var max = jsonObject.daily.data[0].temperatureMax; 
     var min = jsonObject.daily.data[0].temperatureMin; 
    } 
}) 
console.log('Todays forecast ' + summary2 + ' With a current Tempature of ' + temp + '. But feels like ' +realFeel + ' With a high of '+max+' and a low of '+min); 
+1

어쩌면 NODE를 사용하여 바로 시작하기 전에 자바 스크립트 기본 사항을 익히는 데 10 분이 걸릴 것입니까? 틀림없이 도움이 될 것입니다. – vsync

+0

간단한 언어 일지라도 Javascript를 처음으로 잘 이해하지 못하면 노드 학습을 피하는 것이 좋습니다. – jrsala

+1

노드로 시작하기 전에 비동기 콜백에 대해 많은 것을 배워야합니다. 콜백 자체에서 비동기 콜백의 결과 만 사용할 수 있습니다. 결과를 전역 변수에 채우고 비동기 코딩 기술을 사용하는 것을 피할 수는 없습니다. 콜백 자체만으로 결과를 사용할 수있는 타이밍입니다. – jfriend00

답변

0

모든 변수는 콜백 함수에 대해 로컬입니다. console.log 문을 함수로 옮깁니다.

당신은 모든 변수는 콜백 함수에서 var 문 제거, (좋은 생각) 글로벌 싶은 경우 :

(function(){ // add this line 
    var request = require('request'); 
    var summary, temp, realFeel, summary2, max, min; 

    request('https://api.forecast.io/forecast/{API KEY}/42.47994,-83.13040', function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     //var info = JSON.parse(body); 
     var jsonObject = JSON.parse(body); 
     summary = jsonObject.currently.summary; 
     temp = jsonObject.currently.temperature; 
     realFeel = jsonObject.currently.apparentTemperature; 
     summary2 = jsonObject.hourly.summary; 
     max = jsonObject.daily.data[0].temperatureMax; 
     min = jsonObject.daily.data[0].temperatureMin; 

     console.log('Todays forecast ' + summary2 + ' With a current Tempature of ' + temp + '. But feels like ' +realFeel + ' With a high of '+max+' and a low of '+min); 
    } 
    }); 
}()); // and this line to avoid global variables 

을하지만 여전히 날씨 요약을 표시하는 코드의 조각이 필요합니다 . 게시물의 콜백 함수 밖에있는 console.log는 예측 서비스에서 데이터가 다시 오기 전에 실행됩니다. 즉, 콜백 함수 안에 console.log를 넣어야합니다.

이 답변은 귀하의 특정 질문에 대한 직접적인 답변입니다. global variables is an anti-pattern 만들기를 이해하십시오.

+0

어떻게 그 변수를 함수 외부에서 사용할 수 있습니다. – Travis

+0

'var'을 제거하십시오. – sebnukem

+0

내가 배우는 중, 글로벌 변수로 사용하는 것은 왜 나쁜 생각입니까? 또한 편집 코드를 시도하고 콘솔에 정의되지 않은 출력됩니다. – Travis

3

노드는 비동기 서버입니다. 차단하려는 요청을 실행하면 노드 엔진은 다음 코드를 계속 실행합니다. 요청 모듈에 콜백을 전달하고 있지만 요청이 시작된 후 즉시 결과가 반환 된 후 console.log가 실행 중입니다.

콜백 함수 내부에서 데이터를 사용하는 곳에 코드를 삽입하면됩니다.

var request = require('request'); 

request('https://api.forecast.io/forecast/{API KEY}/42.47994,-83.13040', function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     //var info = JSON.parse(body); 
     var jsonObject = JSON.parse(body); 
     var summary = jsonObject.currently.summary; 
     var temp = jsonObject.currently.temperature; 
     var realFeel = jsonObject.currently.apparentTemperature; 
     var summary2 = jsonObject.hourly.summary; 
     var max = jsonObject.daily.data[0].temperatureMax; 
     var min = jsonObject.daily.data[0].temperatureMin; 
     console.log('Todays forecast ' + summary2 + ' With a current Tempature of ' + temp + '. But feels like ' +realFeel + ' With a high of '+max+' and a low of '+min); 
    } 
}) 

또한 오류를 무시해서는 안됩니다.

var request = require('request'); 

request('https://api.forecast.io/forecast/{API KEY}/42.47994,-83.13040', function (error, response, body) { 
    if (error) throw error; 
    if (response.statusCode != 200) return console.log('Invalid status code: '+response.statusCode)      
    var jsonObject = JSON.parse(body); 
    var summary = jsonObject.currently.summary; 
    var temp = jsonObject.currently.temperature; 
    var realFeel = jsonObject.currently.apparentTemperature; 
    var summary2 = jsonObject.hourly.summary; 
    var max = jsonObject.daily.data[0].temperatureMax; 
    var min = jsonObject.daily.data[0].temperatureMin; 
    console.log('Todays forecast ' + summary2 + ' With a current Tempature of ' + temp + '. But feels like ' +realFeel + ' With a high of '+max+' and a low of '+min); 
}); 
0

문제는 당신이 var으로 변수를 선언 할 때 당신은 당신이에있는 기능 범위 수를 선언하는 것입니다. 당신이 VAR로 선언하지 않고 이름을 사용하는 경우는 세계에서 그들을 볼 것이다 "창"범위.

콜백 함수에서 var 키워드를 삭제하면 함수가 전역 범위를 변경해야합니다.

+0

나는 그것을 시도하고 여전히 작품을 나던 ... – Travis

관련 문제