Zu Handbuch Javascript-API

Allgemeine Timeout-Behandlung

Die Javascript-API verwendet JSONP um auf die Golem.de-Webservices zuzugreifen. Auf diese Weise kann die Same-Origin-Policy des Browsers umgangen werden, wodurch der Datenzugriff auf api.golem.de per AJAX über das XMLHttpRequest-Objekt verhindert wird.

JSONP löst dieses Problem, in dem zur Laufzeit die Daten über ein dynamisch erzeugtes script-Tag angefordert werden. Leider steht das umfangreiche Event-Modell des XMLHttpRequest-Objekt dadurch nicht zur Verfügung. Insbesondere ist keine einfache Aussage möglich, ob eine Abfrage tatsächlich erfolgreich war und auch beendet ist.

Um dieses Problem zumindest teilweise zu lösen, unterstützt die Javascript-API bei Anfragen die Angabe eines Timeouts über die Methode setTimeout() der jeweiligen Klasse. Sie erwartet als Parameter ein Objekt-Literal mit zwei Eugenschaften:

  • duration ist die Länge des Timeouts in Millisekunden.
  • fn verweist auf die Funktion, die aufgerufen werden soll, wenn der Timeout überschritten wurde.

Beachten Sie den Unterschied zwischen der Eigenschaft fnError beim den Parametern einer fetch()-Methode und fn des Timeouts. Die fnError zugewiesene Funktion wird aufgerufen, wenn die HTTP-Abfrage selbst funktioniert hat und der jeweilige Webservice aufgerufen wurde, aber die Abfrage nicht korrekt verarbeiten konnte. Zum Beispiel wenn Sie Golem.Api.Article.Meta benutzen, um Artikeldaten zu erhalten, Sie aber einen Artikel-Identifier verwenden, dem kein Artikel zu geordnet ist, wird diese Funktion aufgerufen. Die Funktion, die Sie fn zugewiesen haben, wird hingegen aufgerufen, wenn die HTTP-Abfrage selbst fehlschlägt, da die URL nicht korrekt ist, der Server zu lange braucht um zu antworten oder wenn der Server nicht erreichbar ist.

<script type="text/javascript">

...

var request = new Golem.Api.Article.Meta(12345);

request.setTimeout(
 {
  duration : 10000,

  fn : function() {
    alert('Abfrage konnte nicht durchgeführt werden!');
  }
 );

request.fetch(
    {
        fnSuccess : function() {
            alert('Abfrage war erfolgreich!');
        }

        fnError : function() {
            alert('Artikel existiert nicht!');
        }

    }
);

</script>
Beispiel 1: Abfrage mit Timeout

Leider kann eine gestartete Abfrage per dynamisch erzeugten script-Tag nicht wieder gestoppt werden. Deshalb kann es passieren, dass die fn-Funktion beim Erreichen des Timeouts aufgerufen wird, danach aber ebenfalls fnSuccess bzw. fnError, wenn der Server doch reagiert. Das muss bei der Benutzerführung beachtet werden.



Zu Handbuch Javascript-API