web-dev-qa-db-fra.com

Pourquoi $ .getJSON échoue-t-il silencieusement?

Il semble très gênant que $.getJSON de jQuery échoue de manière silencieuse lorsque les données renvoyées ne sont pas du code JSON valide. Pourquoi cela a-t-il été implémenté avec un échec silencieux? Quel est le moyen le plus simple d’exécuter getJSON avec un meilleur comportement en cas de défaillance (par exemple, déclencher une exception, console.log() ou autre)?

43
Dan Burton

vous pouvez utiliser

        function name() {
            $.getJSON("", function(d) {
                alert("success");
            }).done(function(d) {
                alert("done");
            }).fail(function(d) {
                alert("error");
            }).always(function(d) {
                alert("complete");
            });
        }

Si vous voulez voir la cause de l'erreur, utilisez la version complète.

function name() {
    $.getJSON("", function(d) {
        alert("success");
    }).fail( function(d, textStatus, error) {
        console.error("getJSON failed, status: " + textStatus + ", error: "+error)
    });
}

Si votre JSON n’est pas bien formé, vous verrez quelque chose comme:

getJSON failed, status: parsererror, error: SyntaxError: JSON Parse error: Unrecognized token '/'

Si l'URL est incorrecte, vous verrez quelque chose comme:

getJSON failed, status: error, error: Not Found

Si vous essayez d’obtenir JSON à partir d’un autre domaine en violant la règle Même origine , cette approche renvoie un message vide. Notez que vous pouvez contourner la stratégie Même origine en utilisant JSONP (qui a ses limitations ) ou la méthode préférée de partage de ressources d’origine croisée ( CORS ).

83
Mr Shoubs

Directement de la documentation:

Important: À partir de jQuery 1.4, si le fichier JSON contient une erreur de syntaxe, la demande échouera généralement de manière silencieuse.

Comme le dit la page de documentation, getJSON est simplement une méthode abrégée pour

$.ajax({
    url: url,
    dataType: 'json',
    data: data,
    success: callback
});

Pour obtenir un comportement d'échec, vous pouvez utiliser $ .ajax comme ceci:

$.ajax({
    url: url,
    dataType: 'json',
    data: data,
    success: callback,
    error: another callback
});
29
Håvard

Vous pouvez utiliser $.ajax à la place et définir les options dataType sur "json". De la documentation:

"json": évalue la réponse en tant que JSON et retourne un objet JavaScript. Dans jQuery 1.4, les données JSON sont analysées dans d'une manière stricte; tout JSON mal formé est rejeté et une erreur d'analyse est renvoyée . (Consultez json.org pour plus d'informations sur le formatage JSON correct...)

3
karim79

Vous devriez jeter un coup d'oeil à la documentation de cette API ... elle a une erreur.

http://api.jquery.com/jQuery.getJSON/

0
CrazyDart

Si vous demandez JSONP comme réponse, vous obtiendrez un échec silencieux s'il n'y a pas de réponse (par exemple, une panne de réseau). Voir ce fil pour plus de détails.

0
b.squared