remove additional jquery ajax requests

This commit is contained in:
Matt Walsh 2020-10-01 21:35:49 -05:00
parent 5a766a809d
commit 456af1b09a
11 changed files with 86 additions and 124 deletions

View file

@ -1,5 +1,5 @@
'use strict';
/* globals NoSleep, states, navigation, UNITS */
/* globals NoSleep, states, navigation, UNITS, utils */
document.addEventListener('DOMContentLoaded', () => {
index.init();
});
@ -170,35 +170,27 @@ const index = (() => {
postMessage('units', Units);
};
const autocompleteOnSelect = (suggestion) => {
let request;
const autocompleteOnSelect = async (suggestion) => {
// Do not auto get the same city twice.
if (this.previousSuggestionValue === suggestion.value) return;
if (overrides[suggestion.value]) {
doRedirectToGeometry(overrides[suggestion.value]);
} else {
request = $.ajax({
<<<<<<< Updated upstream
url: 'https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/find',
=======
url: location.protocol + 'https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/find',
>>>>>>> Stashed changes
const data = await utils.fetch.json('https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/find', {
data: {
text: suggestion.value,
magicKey: suggestion.data,
f: 'json',
},
});
request.done((data) => {
const loc = data.locations[0];
if (loc) {
doRedirectToGeometry(loc.feature.geometry);
} else {
alert('An unexpected error occurred. Please try a different search string.');
}
});
}
};
@ -501,8 +493,7 @@ const index = (() => {
let data;
try {
data = await $.ajax({
url: location.protocol + '//geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/reverseGeocode',
data = await utils.fetch.json(location.protocol + '//geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/reverseGeocode', {
data: {
location: longitude + ',' + latitude,
distance: 1000, // Find location up to 1 KM.

View file

@ -17,22 +17,14 @@ class CurrentWeather extends WeatherDisplay {
let observations, station;
try {
// station observations
const observationsPromise = $.ajaxCORS({
type: 'GET',
url: `https://api.weather.gov/stations/${weatherParameters.stationId}/observations`,
const observationsPromise = utils.fetch.json(`https://api.weather.gov/stations/${weatherParameters.stationId}/observations`,{
cors: true,
data: {
limit: 2,
},
dataType: 'json',
crossDomain: true,
});
// station info
const stationPromise = $.ajax({
type: 'GET',
url: `https://api.weather.gov/stations/${weatherParameters.stationId}`,
dataType: 'json',
crossDomain: true,
});
const stationPromise = utils.fetch.json(`https://api.weather.gov/stations/${weatherParameters.stationId}`);
// wait for the promises to resolve
[observations, station] = await Promise.all([observationsPromise, stationPromise]);
@ -40,7 +32,7 @@ class CurrentWeather extends WeatherDisplay {
// TODO: add retry for further stations if observations are unavailable
} catch (e) {
console.error('Unable to get current observations');
console.error(e.status, e.responseJSON);
console.error(e);
this.setStatus(STATUS.failed);
return;
}

View file

@ -25,14 +25,10 @@ class ExtendedForecast extends WeatherDisplay {
if (navigation.units() === UNITS.metric) units = 'si';
let forecast;
try {
forecast = await $.ajax({
type: 'GET',
url: weatherParameters.forecast,
forecast = await utils.fetch.json(weatherParameters.forecast,{
data: {
units,
},
dataType: 'json',
crossDomain: true,
});
} catch (e) {
console.error('Unable to get extended forecast');

View file

@ -31,12 +31,7 @@ class LatestObservations extends WeatherDisplay {
// get data for regional stations
const allConditions = await Promise.all(regionalStations.map(async station => {
try {
const data = await $.ajax({
type: 'GET',
url: `https://api.weather.gov/stations/${station.id}/observations/latest`,
dataType: 'json',
crossDomain: true,
});
const data = await utils.fetch.json(`https://api.weather.gov/stations/${station.id}/observations/latest`);
// format the return values
return Object.assign({}, data.properties, {
StationId: station.id,

View file

@ -94,14 +94,10 @@ class LocalForecast extends WeatherDisplay {
let units = 'us';
if (navigation.units() === UNITS.metric) units = 'si';
try {
return await $.ajax({
type: 'GET',
url: weatherParameters.forecast,
return await utils.fetch.json(weatherParameters.forecast, {
data: {
units,
},
dataType: 'json',
crossDomain: true,
});
} catch (e) {

View file

@ -57,7 +57,7 @@ const navigation = (() => {
const point = await utils.weather.getPoint(latLon.lat, latLon.lon);
// get stations
const stations = utils.fetch.json(point.properties.observationStations);
const stations = await utils.fetch.json(point.properties.observationStations);
const StationId = stations.features[0].properties.stationIdentifier;
@ -68,7 +68,6 @@ const navigation = (() => {
city = city.split('/')[0];
}
// populate the weather parameters
weatherParameters.latitude = latLon.lat;
weatherParameters.longitude = latLon.lon;

View file

@ -59,15 +59,10 @@ class Radar extends WeatherDisplay {
let radarHtml;
try {
// get a list of available radars
radarHtml = await $.ajaxCORS({
type: 'GET',
url: baseUrl,
dataType: 'text',
crossDomain: true,
});
radarHtml = await utils.fetch.text(baseUrl, {cors: true});
} catch (e) {
console.error('Unable to get list of radars');
console.error(e.status, e.responseJSON);
console.log('Unable to get list of radars');
console.error(e);
this.setStatus(STATUS.failed);
return;
}
@ -143,19 +138,13 @@ class Radar extends WeatherDisplay {
context.imageSmoothingEnabled = false;
// get the image
const [blob, status, xhr] = await (()=>new Promise((resolve, reject) => {
$.ajaxCORS({
type: 'GET',
url: baseUrl + url,
xhrFields: {
responseType: 'blob',
},
crossDomain: true,
success: (blob, status, xhr) => resolve([blob,status,xhr]),
error: (xhr, status, e) => reject(e),
});
const response = await fetch(utils.cors.rewriteUrl(baseUrl + url));
}))();
// test response
if (!response.ok) throw new Error(`Unable to fetch radar error ${response.status} ${response.statusText} from ${response.url}`);
// get the blob
const blob = await response.blob();
// store the time
const timeMatch = url.match(/_(\d{4})(\d\d)(\d\d)_(\d\d)(\d\d)_/);
@ -171,7 +160,7 @@ class Radar extends WeatherDisplay {
zone: 'UTC',
}).setZone();
} else {
time = DateTime.fromHTTP(xhr.getResponseHeader('Last-Modified')).setZone();
time = DateTime.fromHTTP(response.headers.get('last-modified')).setZone();
}
// assign to an html image element

View file

@ -74,11 +74,7 @@ class RegionalForecast extends WeatherDisplay {
// start off the observation task
const observationPromise = this.getRegionalObservation(point, city);
const forecast = await $.ajax({
url: point.properties.forecast,
dataType: 'json',
crossDomain: true,
});
const forecast = await utils.fetch.json(point.properties.forecast);
// get XY on map for city
const cityXY = this.getXYForCity(city, minMaxLatLon.maxLat, minMaxLatLon.minLon, weatherParameters.state);
@ -109,8 +105,8 @@ class RegionalForecast extends WeatherDisplay {
this.buildForecast(forecast.properties.periods[2], city, cityXY),
];
} catch (e) {
console.log(`No regional forecast data for '${city.Name}'`);
console.error(e.status, e.responseJSON);
console.log(`No regional forecast data for '${city.name}'`);
console.log(e);
return false;
}
});
@ -151,22 +147,12 @@ class RegionalForecast extends WeatherDisplay {
async getRegionalObservation (point, city) {
try {
// get stations
const stations = await $.ajax({
type: 'GET',
url: point.properties.observationStations,
dataType: 'json',
crossDomain: true,
});
const stations = await utils.fetch.json(point.properties.observationStations);
// get the first station
const station = stations.features[0].id;
// get the observation data
const observation = await $.ajax({
type: 'GET',
url: `${station}/observations/latest`,
dataType: 'json',
crossDomain: true,
});
const observation = await utils.fetch.json(`${station}/observations/latest`);
// preload the image
utils.image.preload(icons.getWeatherRegionalIconFromIconLink(observation.properties.icon, !observation.properties.daytime));
// return the observation

View file

@ -35,11 +35,7 @@ class TravelForecast extends WeatherDisplay {
try {
// get point then forecast
const point = await utils.weather.getPoint(city.Latitude, city.Longitude);
const forecast = await $.ajax({
url: point.properties.forecast,
dataType: 'json',
crossDomain: true,
});
const forecast = await utils.fetch.json(point.properties.forecast);
// determine today or tomorrow (shift periods by 1 if tomorrow)
const todayShift = forecast.properties.periods[0].isDaytime? 0:1;
// return a pared-down forecast

View file

@ -7,16 +7,10 @@ const utils = (() => {
// ****************************** weather data ********************************
const getPoint = async (lat, lon) => {
try {
return await $.ajax({
type: 'GET',
url: `https://api.weather.gov/points/${lat},${lon}`,
dataType: 'json',
crossDomain: true,
});
return await json(`https://api.weather.gov/points/${lat},${lon}`);
} catch (e) {
console.error('Unable to get point');
console.error(lat,lon);
console.error(e.status, e.responseJSON);
console.log(`Unable to get point ${lat}, ${lon}`);
console.error(e);
return false;
}
};
@ -176,22 +170,56 @@ const utils = (() => {
// ********************************* cors ********************************************
// rewrite some urls for local server
const rewriteUrl = (url) => {
url = url.replace('https://api.weather.gov/', '');
url = url.replace('https://radar.weather.gov/', '');
url = url.replace('https://www.cpc.ncep.noaa.gov/', '');
url = url.replace('https://api.weather.gov/', window.location.href);
url = url.replace('https://radar.weather.gov/', window.location.href);
url = url.replace('https://www.cpc.ncep.noaa.gov/', window.location.href);
return url;
};
// ********************************* fetch ********************************************
const json = async (url) => {
const response = await fetch(url, {
const json = (url, params) => fetchAsync(url, 'json', params);
const text = (url, params) => fetchAsync(url, 'text', params);
const raw = (url, params) => fetchAsync(url, '', params);
const blob = (url, params) => fetchAsync(url, 'blob', params);
const fetchAsync = async (_url, responseType, _params={}) => {
// combine default and provided parametersutils
const params = Object.assign({}, {
method: 'GET',
mode: 'cors',
type: 'GET',
},
_params);
// build a url, including the rewrite for cors if necessary
let corsUrl = _url;
if (params.cors === true) corsUrl = rewriteUrl(_url);
const url = new URL(corsUrl);
// add parameters if necessary
if (params.data) {
Object.keys(params.data).forEach((key) => {
// get the value
const value = params.data[key];
// add to the url
url.searchParams.append(key, value);
});
}
if (!response.ok) throw new Error(`Fetch error ${response.status} ${response.statusText} while fetching ${url}`);
// make the request
const response = await fetch(url, params);
// check for ok response
if (!response.ok) throw new Error(`Fetch error ${response.status} ${response.statusText} while fetching ${response.url}`);
// return the requested response
switch (responseType) {
case 'json':
return await response.json();
case 'text':
return await response.text();
case 'blob':
return await response.blob();
default:
return response;
}
};
// return an orderly object
@ -233,15 +261,9 @@ const utils = (() => {
},
fetch: {
json,
}
text,
raw,
blob,
},
};
})();
// pass data through local server as CORS workaround
$.ajaxCORS = function (e) {
// modify the URL
e.url = utils.cors.rewriteUrl(e.url);
// call the ajax function
return $.ajax(e);
};

View file

@ -1 +1 @@
module.exports = '3.5.1';
module.exports = '3.6.0';