API погоды Yahoo передает широту и долготу от внешней функции - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть работающее веб-приложение, которое показывает текущую и прогнозную информацию. Тем не менее, пока это все с широтой и долготой, жестко запрограммированными в сценарии, но я хочу сделать это динамически. Другими словами, я хочу, чтобы прогноз работал для всех, независимо от того, где они находятся, для их местоположения.

Итак, чтобы получить локальный широту и долготу, я использую функцию с 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"
 };

Итак, поскольку объект запроса построен вне какой-либо из погодных функций, какой метод я должен использовать, чтобы обновить мои глобальные переменные (или весь объект запроса, сформированный) до того, как потребуется информация?

Примечание: прежде чем кто-либо решит нажать «Об этом спрашивали раньше!» Кнопка, это не так. Не для этой ситуации.

...