Salut,
Est ce qu'il y a une solution pour arrêter toutes les requêtes ajax en cours(pending) et n’exécuter que la dernières ?
Merci d'avance.

8 réponses


Maenhyr
Réponse acceptée

Ce qu'il faut faire dans ces moments là, ce n'est pas d'envoyer une requête à chaque appui sur la touche mais de lancer un timer. A chaque appui on relance le timer. Si le timer est à 0 on peut alors lancer la requête. De ce fait, tu n'aurais qu'une seule requête d'effectuée. Il faudra faire des tests pour voir à partir de combien de temps on lance la requête, à voir dans les 200-300 ms.

Salut,
Tu as la méthode abort() qui te permet d'annuler une requête AJAX. Si tu as sauvegardée toutes tes requêtes dans un tableau, tu peux le parcourir pour lancer la méthode sur chaque objet.

Est ce que tu me donner plus d'infos ou un exemple car j'ai pas bien compris le principe du "sauvegarde" et d'annulation des requêtes ?
Merci d'avance.

var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});
//kill the request
xhr.abort()

Ici j'initialise ma variable xhr comme étant un objet XMLHttpRequest (défini implicitement par le $.ajax, voir le fonctionnement de la méthode $.ajax() dans jQuery). Le fait d'initialiser mes requêtes AJAX dans des variables me permettent de les annuler quand je le veux.

Tu peux faire ceci pour chacune de tes requêtes. Il te suffit de les ajouter dans un array(). Quand tu veux faire une suppression, tu boucles sur ton tableau et tu annules toutes requêtes sauf la dernière.

J'ai vu cette solution et je l'ai déjà testé(peut être j'ai fait une erreur lors du test) mais ça n'a pas marché :(
J'essaye de valider un champs en utilisant jquery ajax et cakephp dès qu'on tape trois caractères mais lorsque on tape par example 3 caractères valides et le 4ème invalide on est obligé d'attendre l’exécution de la requête 4 fois alors que je veux exécuter seulement la dernière
voici mon code:

// Check validation errors
    var minLength = 3;
    $('input[name^="data"][type=text]').on('keyup', function(){
        var input = $(this);
        var value = $.trim(input.val());
        var url = input.data('url');
        var div = input.parent();
        var serialized = input.serialize();
        if(value.length >= minLength){
            $.ajax({
                type: 'POST',
                url: url+'.json',
                data: serialized,
                dataType: 'json',
                success: function(data){
                    var error = data.error;
                    if(error){
                        div.removeClass('valid').addClass('invalid');
                    }else{
                        div.removeClass('invalid').addClass('valid');
                    }
                }
            });
        }else if (value === ''){
            div.removeClass('valid');
            div.removeClass('invalid');
        }
    });

j'ajoute un attribut "data-url" dans l'input avec le nom du controller et l'action(checkErrors):

<?= $this->Form->input('Post.name', array('label' => __("Titre de l'article:"), 'data-url' => $this->Html->url(array('action' => 'checkErrors', 'controller' => 'posts')))); ?>

et ceci dans l'AppController :

public function admin_checkErrors(){
        $this->RequestHandler = $this->Components->load('RequestHandler');
        if($this->RequestHandler->isAjax()){
            $model = Inflector::classify($this->request->controller);
            $field = array_keys(current($this->request->data))[0];
            $this->{$model}->set($this->request->data);
            if($this->{$model}->validates(array('fieldList' => array($model => $field)))){
                $data'error'] = false;
            }else{
                $data'error'] = current($this->{$model}->validationErrors);
            }
            $this->set($data);
            $this->set('_serialize', array('error'));
        }
    }

tu veux dire utiliser setTimeout??

window.setTimeout(function(){
                $.ajax({
                    type: 'POST',
                    url: url+'.json',
                    data: serialized,
                    dataType: 'json',
                    success: function(data){
                        var error = data.error;
                        if(error){
                            div.removeClass('valid').addClass('invalid');
                        }else{
                            div.removeClass('invalid').addClass('valid');
                        }

                    }
                });
            }, 300);

C'est une bonne piste en effet. Tu peux donc le stopper avec un clearTimeout() à chaque appui sur une touche.

merci bcp prbaron ;)
enfin mon prob est résolu
voici le code final :

// Check validation errors
    var minLength = 3;
    var timeOutID = 0;
    $('input[name^="data"][type=text]').on('keyup', function(){
        var input = $(this);
        var value = $.trim(input.val());
        var url = input.data('url');
        var div = input.parent();
        var serialized = input.serialize();
        if(value.length >= minLength){
            if(timeOutID !== 0) clearTimeout(timeOutID);
            timeOutID = setTimeout(function(){
                timeOutID = 0;
                $.ajax({
                    type: 'POST',
                    url: url+'.json',
                    data: serialized,
                    dataType: 'json',
                    beforeSend: function(){
                        div.addClass('loading');
                    },
                    complete: function(){
                        div.removeClass('loading');
                    },
                    success: function(data){
                        var error = data.error;
                        var value = input.val();
                        if(error){
                            div.removeClass('valid').addClass('invalid');
                        }else{
                            div.removeClass('invalid').addClass('valid');
                        }
                        if(value === ''){
                            div.removeClass('valid');
                            div.removeClass('invalid');
                        }
                    }
                });
            }, 250);
        }else if (value === ''){
            div.removeClass('valid');
            div.removeClass('invalid');
        }
    });