Blame platform-demos/ko/weatherGeonames.js.page

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>