|
Packit |
1470ea |
|
|
Packit |
1470ea |
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" style="task" id="weatherGeonames.js" xml:lang="ko">
|
|
Packit |
1470ea |
<info>
|
|
Packit |
1470ea |
<link type="guide" xref="weatherApp.js#main"/>
|
|
Packit |
1470ea |
<revision version="0.1" date="2012-03-09" status="stub"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<credit type="author copyright">
|
|
Packit |
1470ea |
<name>Susanna Huhtanen</name>
|
|
Packit |
1470ea |
<email its:translate="no">ihmis.suski@gmail.com</email>
|
|
Packit |
1470ea |
<years>2012</years>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<desc/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>조성호</mal:name>
|
|
Packit |
1470ea |
<mal:email>shcho@gnome.org</mal:email>
|
|
Packit |
1470ea |
<mal:years>2017</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
</info>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<title>로컬 라이브러리 geoName</title>
|
|
Packit |
1470ea |
<synopsis>
|
|
Packit |
1470ea |
안내서의 이 부분에서는 비동기 호출을 활용하여 로컬 라이브러리 geoNames를 만듭니다. 이 예제의 날씨 정보는 geonames.org에서 가져오며, 프로그램에서 날씨 정보를 요청할 때 <link href="http://en.wikipedia.org/wiki/List_of_airports_by_ICAO_code:_E">ICAO codes</link>를 활용합니다. 모든 코드 예제를 여러분 스스로 작성하고 실행하라면 코드를 작성해넣을 편집기, 터미널, 그놈 3 이상을 컴퓨터에 설치해야 합니다. 이 안내서에서는 다음 내용을 진행합니다:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<list>
|
|
Packit |
1470ea |
<item><link xref="#geonamesimports">날씨 정보를 가져올 자체 라이브러리</link> </item>
|
|
Packit |
1470ea |
<item><link xref="#geonamesfunction">geoNames용 함수 만들기</link> </item>
|
|
Packit |
1470ea |
<item><link xref="#geonamesmethods">geoNames용 메서드</link> </item>
|
|
Packit |
1470ea |
<item><link xref="#geonames.js">geonames.js </link> </item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
</synopsis>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="geonamesimports">
|
|
Packit |
1470ea |
<title>날씨 정보를 가져오는 자체 라이브러리</title>
|
|
Packit |
1470ea |
이 동작을 처리할 때 로컬 라이브러리로 쓸 새 파일이 필요합니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
const Soup = imports.gi.Soup;
|
|
Packit |
1470ea |
const _httpSession = new Soup.SessionAsync();
|
|
Packit |
1470ea |
Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
첫번째 줄에는 로컬 라이브러리에서 필요한 라이브러리를 가져오고 초기화 합니다. Soup는 모든 http 요청을 처리합니다.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="geonamesfunction">
|
|
Packit |
1470ea |
<title>GeoNames 함수 만들기</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
function GeoNames(station) {
|
|
Packit |
1470ea |
this.station = station;
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
GeoNames.prototype = {
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
날씨를 가져올 때 처리할 GeoNames 함수를 만들었습니다. JavaScript에서는 일단 안에 넣고 나중에 확장할 함수를 만들 수 있습니다. GeoNames.prototyle 중괄호 안에 넣으면 됩니다.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="geonamesmethods">
|
|
Packit |
1470ea |
<title>GeoNames용 메서드</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
getWeather: function(callback) {
|
|
Packit |
1470ea |
var request = Soup.Message.new('GET', 'http://api.geonames.org/weatherIcaoJSON?ICAO=' + this.station + '&username=demo');
|
|
Packit |
1470ea |
_httpSession.queue_message(request, function(_httpSession, message) {
|
|
Packit |
1470ea |
if (message.status_code !== 200) {
|
|
Packit |
1470ea |
callback(message.status_code, null);
|
|
Packit |
1470ea |
return;
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
var weatherJSON = request.response_body.data;
|
|
Packit |
1470ea |
var weather = JSON.parse(weatherJSON);
|
|
Packit |
1470ea |
callback(null, weather);
|
|
Packit |
1470ea |
});
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
getIcon: function(weather){
|
|
Packit |
1470ea |
switch (weather.weatherObservation.weatherCondition){
|
|
Packit |
1470ea |
case "drizzle":
|
|
Packit |
1470ea |
case "light showers rain":
|
|
Packit |
1470ea |
case "light rain":
|
|
Packit |
1470ea |
return "weather-showers-scattered.svg";
|
|
Packit |
1470ea |
case "rain":
|
|
Packit |
1470ea |
return "weather-showers.svg";
|
|
Packit |
1470ea |
case "light snow":
|
|
Packit |
1470ea |
case "snow grains":
|
|
Packit |
1470ea |
return "weather-snow.svg";
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
switch (weather.weatherObservation.clouds){
|
|
Packit |
1470ea |
case "few clouds":
|
|
Packit |
1470ea |
case "scattered clouds":
|
|
Packit |
1470ea |
return "weather-few-clouds.svg";
|
|
Packit |
1470ea |
case "clear sky":
|
|
Packit |
1470ea |
return "weather-clear.svg"
|
|
Packit |
1470ea |
case "broken clouds":
|
|
Packit |
1470ea |
case "overcast":
|
|
Packit |
1470ea |
return "weather-overcast.svg";
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
return "weather-fog.svg";
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
GeoNames의 첫 메서드는 getWeather와 getIcon입니다. getWeather에서 Soup로 http 요청, 오류를 처리하며, 요청의 응답으로 온 정보를 우리가 사용할 수 있는 모양새로 해석합니다. getIcon에서는 getWeather에서 가져온 결과를 비교하여 현재 날씨와 일치하는 아이콘 결과를 가져옵니다. 이제 준비한 로컬 라이브러리가 있으니 쓸 수 있게 만들 시간입니다.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="geonames.js">
|
|
Packit |
1470ea |
<title>geonames.js</title>
|
|
Packit |
1470ea |
로컬 라이브러리 전체 코드입니다. 주 프로그램 파일에서는 비동기 방식으로 호출합니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
const Soup = imports.gi.Soup;
|
|
Packit |
1470ea |
const _httpSession = new Soup.SessionAsync();
|
|
Packit |
1470ea |
Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
function GeoNames(station) {
|
|
Packit |
1470ea |
this.station = station;
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
GeoNames.prototype = {
|
|
Packit |
1470ea |
getWeather: function(callback) {
|
|
Packit |
1470ea |
var request = Soup.Message.new('GET', 'http://api.geonames.org/weatherIcaoJSON?ICAO=' + this.station + '&username=demo');
|
|
Packit |
1470ea |
_httpSession.queue_message(request, function(_httpSession, message) {
|
|
Packit |
1470ea |
if (message.status_code !== 200) {
|
|
Packit |
1470ea |
callback(message.status_code, null);
|
|
Packit |
1470ea |
return;
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
var weatherJSON = request.response_body.data;
|
|
Packit |
1470ea |
var weather = JSON.parse(weatherJSON);
|
|
Packit |
1470ea |
callback(null, weather);
|
|
Packit |
1470ea |
});
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
getIcon: function(weather){
|
|
Packit |
1470ea |
switch (weather.weatherObservation.weatherCondition){
|
|
Packit |
1470ea |
case "drizzle":
|
|
Packit |
1470ea |
case "light showers rain":
|
|
Packit |
1470ea |
case "light rain":
|
|
Packit |
1470ea |
return "weather-showers-scattered.svg";
|
|
Packit |
1470ea |
case "rain":
|
|
Packit |
1470ea |
return "weather-showers.svg";
|
|
Packit |
1470ea |
case "light snow":
|
|
Packit |
1470ea |
case "snow grains":
|
|
Packit |
1470ea |
return "weather-snow.svg";
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
switch (weather.weatherObservation.clouds){
|
|
Packit |
1470ea |
case "few clouds":
|
|
Packit |
1470ea |
case "scattered clouds":
|
|
Packit |
1470ea |
return "weather-few-clouds.svg";
|
|
Packit |
1470ea |
case "clear sky":
|
|
Packit |
1470ea |
return "weather-clear.svg"
|
|
Packit |
1470ea |
case "broken clouds":
|
|
Packit |
1470ea |
case "overcast":
|
|
Packit |
1470ea |
return "weather-overcast.svg";
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
return "weather-fog.svg";
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</page>
|