Zum Inhalt springen
Fehler und Wiederholungen im SDK

Fehler und Wiederholungen im SDK

Jeder Helfer wirft einen MapxError, wenn die API einen Fehler meldet oder das Netz ausfällt. Er bildet das application/problem+json-Dokument des Fehlerkatalogs ab.

EigenschaftBedeutung
statusHTTP-Status, 0 bei Netzwerkfehler
codeStabiler Code wie invalid-parameter, not-found, rate-limited
paramDer fehlerhafte Parameter, falls bekannt
allowedErlaubte Werte bei Aufzählungen
detailErklärung zu dieser Anfrage
retryAfterWartezeit in Sekunden bei 429
try {
  await mapx.geocode("Wien", { types: ["village"] });
} catch (e) {
  if (e instanceof mapx.MapxError && e.code === "invalid-parameter") {
    console.log(`${e.param} muss eines von ${e.allowed.join(", ")} sein`);
  } else throw e;
}

Auf code verzweigen, nie auf den Text. Deutsche Meldungen gibt es mit Accept-Language: de über einen eigenen fetch; die Helfer verwenden den Browser-Standard.

Wiederholen mit Backoff

Nur 429, 502, 503 und Netzwerkfehler wiederholen. 400, 404 und 422 nie wiederholen: dieselbe Anfrage scheitert genauso.

async function withRetry(fn, tries = 3) {
  for (let i = 0; ; i++) {
    try { return await fn(); }
    catch (e) {
      const retryable = e instanceof mapx.MapxError && [0, 429, 502, 503].includes(e.status);
      if (!retryable || i === tries - 1) throw e;
      await new Promise((r) => setTimeout(r, (e.retryAfter ?? 2 ** i) * 1000));
    }
  }
}
const m = await withRetry(() => mapx.matrix("driving", [[16.3725, 48.2085], [15.3294, 48.2272]]));

Veraltete Anfragen abbrechen

Eingabefelder mit Vorschlägen sollten die vorige Anfrage abbrechen. Eine abgebrochene Anfrage wirft den AbortError des Browsers, keinen MapxError:

let ac;
input.oninput = async () => {
  ac?.abort(); ac = new AbortController();
  try { show(await mapx.searchSuggest(input.value, { signal: ac.signal })); }
  catch (e) { if (e.name !== "AbortError") throw e; }
};

Weiter