У меня есть работающее веб-приложение, которое показывает текущую и прогнозную информацию. Тем не менее, пока это все с широтой и долготой, жестко запрограммированными в сценарии, но я хочу сделать это динамически. Другими словами, я хочу, чтобы прогноз работал для всех, независимо от того, где они находятся, для их местоположения.
Итак, чтобы получить локальный широту и долготу, я использую функцию с API геолокации, и это прекрасно работает. Но у меня возникают проблемы с передачей этого в функцию погоды Yahoo, поскольку я, вероятно, получаю данные слишком поздно для вызова API.
Их основной javascript, как показано на их странице, (и, позвольте мне повторить, что у меня все работает нормально, но не динамически):
var url = 'https://weather-ydn-yql.media.yahoo.com/forecastrss';
var method = 'GET';
var app_id = 'your-app-id';
var consumer_key = 'your-consumer-key';
var consumer_secret = 'your-consumer-secret';
var concat = '&';
// This is the object that will be changed, as shown below
var query = {'location': 'sunnyvale,ca', 'format': 'json'};
//////
var oauth = {
'oauth_consumer_key': consumer_key,
'oauth_nonce': Math.random().toString(36).substring(2),
'oauth_signature_method': 'HMAC-SHA1',
'oauth_timestamp': parseInt(new Date().getTime() / 1000).toString(),
'oauth_version': '1.0'
};
var merged = {};
$.extend(merged, query, oauth);
var merged_arr = Object.keys(merged).sort().map(function(k) {
return [k + '=' + encodeURIComponent(merged[k])];
});
var signature_base_str = method
+ concat + encodeURIComponent(url)
+ concat + encodeURIComponent(merged_arr.join(concat));
var composite_key = encodeURIComponent(consumer_secret) + concat;
var hash = CryptoJS.HmacSHA1(signature_base_str, composite_key);
var signature = hash.toString(CryptoJS.enc.Base64);
oauth['oauth_signature'] = signature;
var auth_header = 'OAuth ' + Object.keys(oauth).map(function(k) {
return [k + '="' + oauth[k] + '"'];
}).join(',');
$.ajax({
url: url + '?' + $.param(query),
headers: {
'Authorization': auth_header,
'X-Yahoo-App-Id': app_id
},
method: 'GET',
success: function(data){
console.log(data);
}
});
Мой javascript во многом такой же плюс, вверху страницы у меня есть:
var lat = "";
var long = "";
window.onload = function(){
navigator.geolocation.getCurrentPosition(success, error);
function success(pos) {
lat = pos.coords.latitude;
long = pos.coords.longitude;
}
function error() {
console.log('There was an error');
}
};
console.log(lat + " : " + long);
// This just shows ":", so the globals are not updating in time
... и вместо "location" в объекте запроса у меня есть:
var query = {
"lat": lat,
"lon": long,
"u": "c",
"format": "json"
};
Итак, поскольку объект запроса построен вне какой-либо из погодных функций, какой метод я должен использовать, чтобы обновить мои глобальные переменные (или весь объект запроса, сформированный) до того, как потребуется информация?
Примечание: прежде чем кто-либо решит нажать «Об этом спрашивали раньше!» Кнопка, это не так. Не для этой ситуации.