Susanna Huhtanen
ihmis.suski@gmail.com 2012

# Τοπική βιβλιοθήκη 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"; } } }