jQuery.l'option asynchrone de la méthode ajax() est obsolète, et maintenant?

Comme de jQuery 1.8, l'utilisation de async:false dans jQuery.ajax() est obsolète.
Mais combien de pages web avez-vous vu avec un "écran de chargement" alors qu'il y a une communication AJAX en cours en arrière-plan? J'ai probablement vu des milliers d'entre eux.

Mon cas est que j'écris une application mobile qui doit charger un fichier de langue. Et au début je charge le fichier de langue et je récupère le texte des boutons et d'autres éléments de L'interface graphique de la langue fichier.

C'est vraiment mauvais pour moi. Parce que si le fichier de langue est manquant, L'interface graphique ne devrait pas apparaître. Alors, comment puis-je le résoudre? Mettez tout mon code dans le rappel success? Cela ne me semble pas être une bonne pratique de codage. Puis-je le résoudre d'une autre manière?

45
demandé sur Sk8erPeter 2012-07-12 12:40:07

4 réponses

, La solution est d'ajouter manuellement une superposition d'empêcher l'utilisateur d'interagir avec l'interface, puis le retirer une fois la requête AJAX est fait.

$(function() {
    show_overlay();        

    $.ajax({
        // Query to server
    }).done(function() {
        // Verify good data
        // Do stuff
        remove_overlay();
    });
});
31
répondu Jørgen R 2012-07-12 08:46:44

J'ai lu la discussion officielle dans le ticket à propos de la dépréciation de ce paramètre et voici ce que j'ai compris:

  • Le problème est que l'implémentation de Promise s (1) pour la synchronisation AJAX leur donne des frais généraux.

  • Il existe des tonnes de cas d'utilisation réels de SYNC AJAX, par exemple la préservation de l'état avant le déchargement de la page. Par conséquent, cette fonctionnalité restera, mais la façon dont vous l'utilisez peut changer.

  • La solution la plus proche (atterrissage en 1.8?) est de ne prendre en charge que les rappels (mais pas les promesses) lorsque async est false.

Pour conclure : continuez à utiliser async: false Si vous le DEVEZ, mais méfiez-vous de ses inconvénients (blocage de VM). Ne vous inquiétez pas, vous recevrez une alternative si cette fonctionnalité est supprimée $.ajax().

29
répondu Infeligo 2013-05-13 23:53:39

Je parierais que Beaucoup de de ces 1000 pages ne bloquent pas réellement l'interface utilisateur en attendant L'appel AJAX. Au lieu de cela, ils masquent probablement l'interface utilisateur avec l'écran d'attente au moment où l'appel est effectué, puis supprimez-le sur un gestionnaire de réponse.

Il existe de nombreuses façons d'obscurcir l'interface utilisateur (vous pouvez même utiliser une boîte de dialogue jQuery UI définie sur Modal et n'ayant pas de boutons d'échappement ou de fermeture), donc je vous laisse la décision. Mais la disposition du code serait quelque chose comme ceci:

var someFunction = function () {

    // any pre-conditions to the logic
    // obscure the UI here

    $.ajax({
        url: 'ajax/test.html',
        success: function(data) {

            // handle the response
            // show the UI again

        },
        error: function(data) {

            // handle the response
            // show the UI again

        }
    }); 
}

Je suis sûr qu'il y a plusieurs façons d'atteindre cet ordre d'événements, mais c'est l'idée générale. Bloquer l'interface utilisateur n'a jamais vraiment été l'intention, et j'imagine que c'était une décision encore plus difficile pour jQuery de inclure cette fonctionnalité que de La supprimer. Il est censé être asynchrone.

2
répondu David 2012-07-12 08:49:04

Pourquoi utiliseriez-vous ajax pour obtenir ce fichier? Incluez-le simplement en utilisant une balise script.

Dans tous les cas, vous ne mettez pas tout votre code dans le onSuccess - à la place, vous appelez une seule fonction à partir de là qui démarre votre code en cours d'exécution.

0
répondu Ariel 2012-07-12 08:46:38