Blame platform-demos/cs/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="cs">
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
  </info>
Packit 1470ea
Packit 1470ea
  <title>Místní knihovna geoNames</title>
Packit 1470ea
  <synopsis>
Packit 1470ea
    

V této část lekce sestrojíme místní knihovnu geoNames používající asynchronní volání. Informace o počasí budeme v tomto příkladu získávat z geonames.org a aplikace používá <link href="http://cs.wikipedia.org/wiki/ICAO_k%C3%B3d_leti%C5%A1t%C4%9B">kódy ICAO</link> pro určení místa v požadavku o počasí. Abyste si mohli napsat a spustit kód příkladu sami, budete potřebovat v počítači nainstalovaný editor pro psaní kódu, terminál a GNOME 3.0 nebo novější. V této lekci budeme postupovat následujícími částmi:

Packit 1470ea
Packit 1470ea
    <list>
Packit 1470ea
      <item>

<link xref="#geonamesimports">Místní knihovna pro získávání počasí</link>

</item>
Packit 1470ea
      <item>

<link xref="#geonamesfunction">Vytvoření funkce GeoNames</link>

</item>
Packit 1470ea
      <item>

<link xref="#geonamesmethods">Metody pro 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>Místní knihovna pro získávání počasí</title>
Packit 1470ea
  

K tomu potřebujeme nový soubor, který bude naší místní knihovnou.

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
  

Na prvních řádcích naimportujeme a inicializujeme knihovny, které potřebujeme použít v této místní knihovně. Knihovna Soup zpracovává všechny požadavky, které musíme dělat přes HTTP.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="geonamesfunction">
Packit 1470ea
  <title>Vytvoření funkce 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
  

Zde vytvoříme funkci GeoNames, která se nám bude starat o získávání počasí. JavaScript umožňuje vytvořit funkce, které na začátku mají v těle jen základ, který později rozšíříme. Provádíme to mezi složenými závorkami u GeoNames.prototype.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="geonamesmethods">
Packit 1470ea
  <title>Metody pro 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
  

První metodou pro GeoName je getWeather a druhou getIcon. V getWeather vytvoříme pomocí knihovny soup požadavek http, obsloužíme chyby a zpracujeme informace z odpovědi do formy, kterou chceme používat. V getIcon jednoduše porovnáme výsledky, které jsem dostali od předchozí funkce a podle nich ve výrazu switch získáme ikonu odpovídající aktuálnímu počasí. Nyní, když máme naši místní knihovnu připravenou, je načase ji použít.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
Packit 1470ea
  <section id="geonames.js">
Packit 1470ea
  <title>geonames.js</title>
Packit 1470ea
  

Zde je celý kód pro naši místní knihovnu. Soubor s hlavním programem ji volá asynchronně.

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>