web-dev-qa-db-fra.com

getJSON délai d'attente

J'utilise la fonction jQuery getJSON(). Cette fonction permet d’obtenir des données sans problème. Mais parfois, attendre, attendre, attendre ... Et ma barre de chargement indique chargement chargement chargement au centre de la page. Donc, la fonction jQuery ajax() a une variable de délai d’expiration. Mais je veux utiliser la fonction getJSON. Et je pense que je peux utiliser les fonctions ajaxStart() et ajaxStop(). Mais comment?

$('.loadingDiv')
    .hide()
    .ajaxStart(function() {
        $(this).fadeIn();
        setTimeout("throw '';",15000) //i used this but didn't work
        setTimeout("return;",15000) //i used this but didn't work
        setTimeout("abort();",15000) //i used this but didn't work.(Abort all ajax events)
    })
    .ajaxStop(function() {
        $(this).fadeOut();
    });
19
pheaselegen

getJSON() renvoie une promesse sur laquelle vous pouvez appeler la fonction abort

var p = $.getJSON(..., function(){ alert('success');});
setTimeout(function(){ p.abort(); }, 2000);

EDIT: mais si votre objectif est simplement d'avorter si cela prend trop de temps, la réponse de Lethal-Guitar est meilleure.

15
Denys Séguret

getJSON() est juste un raccourci pour ce qui suit:

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

Vous pouvez donc utiliser $.ajax() et spécifier l’option timeout comme vous le souhaitez. Voir aussi: http://api.jquery.com/jQuery.getJSON/

15
lethal-guitar

Comme le dit Lethal-Guitar, la fonction getJSON() n'est qu'un raccourci pour $.ajax(). Si vous souhaitez détecter si un dépassement de délai s'est produit plutôt qu'une erreur réelle, utilisez le code ci-dessous.

var request = $.ajax({
    dataType: "json",
    url: url,
    data: data,
    success: function( ) { },
    timeout: 2000
}).fail( function( xhr, status ) {
    if( status == "timeout" ) {
        // do stuff in case of timeout
    }
});
10
Bruno

Il y a toujours la voie nucléaire aussi:

//Set AJAX timeout to 10 seconds
$.ajaxSetup({
  timeout: 10*1000
});

Cela définira toutes les requêtes AJAX de votre programme (même via $ .getJSON) afin d’avoir un délai de 10 secondes (ou ce que vous avez).

3
Richard

la fonction setTimeout exécute un ensemble de code après un nombre spécifié de millisecondes dans la portée globale.

La fonction getJSON (selon la documentation jQuery ici http://api.jquery.com/jQuery.getJSON/ ) est un raccourci pour:

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

alors vous voudriez faire votre appel comme suit:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success,
  timeout: 15000
});

$('.loadingDiv')
    .hide()
    .ajaxStart(function() {
        $(this).fadeIn();
    })
    .ajaxStop(function() {
        $(this).fadeOut();
    });
1
renab

Je pense qu'aucune de ces réponses n'est idéale. Je sais que cela a pris du retard, mais vous souhaitez utiliser les options de rappel de réussite/d'erreur de la méthode .ajax(); lors de la réception d'une réponse JSONP.

Exemple de comment je structurerais ceci:

    // Call
    $.ajax({

      // URL you want to get
      url: 'http://example.com/json?callback=?',

      // Set a realistic time in milliseconds
      timeout: 3000,

      // Put in success callback function here, this example
      // shows you the data you got back from the call
      success: function(data) {
        console.log(data);
      },

      // Put in an error handling function, just an alert in this case
      error: function(badData) {
        alert('The call was unsuccessful');
      },

      type: 'POST'
    });
0
staypuftman