Susanna Huhtanen ihmis.suski@gmail.com 2012 Ελληνική μεταφραστική ομάδα GNOME team@gnome.gr 2012-2015 Δημήτρης Σπίγγος dmtrs32@gmail.com 2012, 2013 Μαρία Θουκιδίδου marablack3@gmail.com 2014 Θάνος Τρυφωνίδης tomtryf@gmail.com 2014, 2015 Τοπική βιβλιοθήκη geoNames

Σε αυτό το τμήμα του οδηγού πρόκειται να κατασκευάσουμε μια τοπική βιβλιοθήκη geoNames χρησιμοποιώντας ασύγχρονες κλήσεις. Οι πληροφορίες του καιρού σε αυτό το παράδειγμα παρέχονται από τον geonames.org και η εφαρμογή χρησιμοποιεί το κωδικούς ICAO για να τοποθετήσει την αίτηση σας για τον καιρό. Για να γράψετε και να εκτελέσετε οι ίδιοι τα παραδείγματα του κώδικα, χρειάζεστε έναν επεξεργαστή για να γράψετε τον κώδικα, τερματικό και GNOME 3 ή μεγαλύτερο εγκατεστημένο στον υπολογιστή σας. Σε αυτόν τον οδηγό θα εξετάσουμε τα παρακάτω μέρη:

Τοπική βιβλιοθήκη για λήψη του καιρού

Δημιουργώντας συναρτήσεις geoNames

Μέθοδοι για το geoNames

geonames.js

Τοπική βιβλιοθήκη για λήψη του καιρού

Για αυτό θα χρειαστούμε ένα νέο αρχείο που θα είναι η τοπική μας βιβλιοθήκη.

const Soup = imports.gi.Soup; const _httpSession = new Soup.SessionAsync(); Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());

Στις πρώτες γραμμές θα εισάγουμε και θα αρχικοποιήσουμε τις απαιτούμενες βιβλιοθήκες για χρήση σε αυτή την τοπική βιβλιοθήκη. Το Soup επεξεργάζεται όλες τις αιτήσεις που πρέπει να κάνουμε με http.

Δημιουργία συνάρτησης geoNames function GeoNames(station) { this.station = station; } GeoNames.prototype = { }

Εδώ δημιουργούμε τη συνάρτηση GeoNames που θα χειριστεί τη λήψη καιρού για μας. Το JavaScript επιτρέπει τη δημιουργία συναρτήσεων που έχουν λίγο μέσα στην αρχή και αργότερα τις επεκτείνει. Αυτό θα γίνει μέσα στα άγκιστρα {} του GeoNames.prototype

Μέθοδοι για GeoNames getWeather: function(callback) { var request = Soup.Message.new('GET', 'http://api.geonames.org/weatherIcaoJSON?ICAO=' + this.station + '&username=demo'); _httpSession.queue_message(request, function(_httpSession, message) { if (message.status_code !== 200) { callback(message.status_code, null); return; } var weatherJSON = request.response_body.data; var weather = JSON.parse(weatherJSON); callback(null, weather); }); }, getIcon: function(weather){ switch (weather.weatherObservation.weatherCondition){ case "drizzle": case "light showers rain": case "light rain": return "weather-showers-scattered.svg"; case "rain": return "weather-showers.svg"; case "light snow": case "snow grains": return "weather-snow.svg"; } switch (weather.weatherObservation.clouds){ case "few clouds": case "scattered clouds": return "weather-few-clouds.svg"; case "clear sky": return "weather-clear.svg" case "broken clouds": case "overcast": return "weather-overcast.svg"; } return "weather-fog.svg"; }

Η πρώτη μέθοδος για το GeoNames είναι η getWeather και η δεύτερη η getIcon. Στην getWeather κάνουμε μια αίτηση http με soup, επεξεργασία σφαλμάτων και έπειτα ανάλυση της πληροφορίας από την αίτηση για μορφή που μπορούμε να χρησιμοποιήσουμε. Στο getIcon συγκρίνουμε απλά τα αποτελέσματα που παίρνουμε από getWeather στον διακόπτη που έχουμε για τη λήψη εικονιδίου που ταιριάζει στον τρέχοντα καιρό. Τώρα που έχουμε την τοπική μας βιβλιοθήκη έτοιμη, είναι καιρός να τη χρησιμοποιήσουμε.

geonames.js

Εδώ είναι όλος ο κώδικας για την τοπική μας βιβλιοθήκη. Το αρχείο του κυρίως προγράμματος το καλεί ασύγχρονα.

const Soup = imports.gi.Soup; const _httpSession = new Soup.SessionAsync(); Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault()); function GeoNames(station) { this.station = station; } GeoNames.prototype = { getWeather: function(callback) { var request = Soup.Message.new('GET', 'http://api.geonames.org/weatherIcaoJSON?ICAO=' + this.station + '&username=demo'); _httpSession.queue_message(request, function(_httpSession, message) { if (message.status_code !== 200) { callback(message.status_code, null); return; } var weatherJSON = request.response_body.data; var weather = JSON.parse(weatherJSON); callback(null, weather); }); }, getIcon: function(weather){ switch (weather.weatherObservation.weatherCondition){ case "drizzle": case "light showers rain": case "light rain": return "weather-showers-scattered.svg"; case "rain": return "weather-showers.svg"; case "light snow": case "snow grains": return "weather-snow.svg"; } switch (weather.weatherObservation.clouds){ case "few clouds": case "scattered clouds": return "weather-few-clouds.svg"; case "clear sky": return "weather-clear.svg" case "broken clouds": case "overcast": return "weather-overcast.svg"; } return "weather-fog.svg"; } } }