Retry failed overpass requests
This commit is contained in:
parent
a27f8839d9
commit
a82cdbf7e0
@ -1,7 +1,16 @@
|
|||||||
import Service from '@ember/service';
|
import Service from '@ember/service';
|
||||||
|
|
||||||
export default class OsmService extends Service {
|
export default class OsmService extends Service {
|
||||||
|
controller = null;
|
||||||
|
|
||||||
async getNearbyPois(lat, lon, radius = 50) {
|
async getNearbyPois(lat, lon, radius = 50) {
|
||||||
|
// Cancel previous request if it exists
|
||||||
|
if (this.controller) {
|
||||||
|
this.controller.abort();
|
||||||
|
}
|
||||||
|
this.controller = new AbortController();
|
||||||
|
const signal = this.controller.signal;
|
||||||
|
|
||||||
const query = `
|
const query = `
|
||||||
[out:json][timeout:25];
|
[out:json][timeout:25];
|
||||||
(
|
(
|
||||||
@ -17,10 +26,32 @@ out center;
|
|||||||
const url = `https://overpass-api.de/api/interpreter?data=${encodeURIComponent(
|
const url = `https://overpass-api.de/api/interpreter?data=${encodeURIComponent(
|
||||||
query
|
query
|
||||||
)}`;
|
)}`;
|
||||||
const res = await fetch(url);
|
|
||||||
if (!res.ok) throw new Error('Overpass request failed');
|
try {
|
||||||
const data = await res.json();
|
const res = await this.fetchWithRetry(url, { signal });
|
||||||
return data.elements;
|
if (!res.ok) throw new Error('Overpass request failed');
|
||||||
|
const data = await res.json();
|
||||||
|
return data.elements;
|
||||||
|
} catch (e) {
|
||||||
|
if (e.name === 'AbortError') {
|
||||||
|
console.log('Overpass request aborted');
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fetchWithRetry(url, options = {}, retries = 1) {
|
||||||
|
try {
|
||||||
|
return await fetch(url, options);
|
||||||
|
} catch (e) {
|
||||||
|
if (retries > 0 && e.name !== 'AbortError') {
|
||||||
|
console.log(`Retrying Overpass request... (${retries} left)`);
|
||||||
|
await new Promise((r) => setTimeout(r, 1000));
|
||||||
|
return this.fetchWithRetry(url, options, retries - 1);
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async getPoiById(id) {
|
async getPoiById(id) {
|
||||||
@ -44,7 +75,7 @@ out center;
|
|||||||
const url = `https://overpass-api.de/api/interpreter?data=${encodeURIComponent(
|
const url = `https://overpass-api.de/api/interpreter?data=${encodeURIComponent(
|
||||||
query
|
query
|
||||||
)}`;
|
)}`;
|
||||||
const res = await fetch(url);
|
const res = await this.fetchWithRetry(url);
|
||||||
if (!res.ok) throw new Error('Overpass request failed');
|
if (!res.ok) throw new Error('Overpass request failed');
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
return data.elements[0]; // Return the first match
|
return data.elements[0]; // Return the first match
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user