|
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>
|