Question Appel jQuery Ajax - Définit la valeur de la variable en cas de succès [dupliquer]


Cette question a déjà une réponse ici:

J'ai une application que j'écris qui modifie les données sur un objet en cache dans le serveur. Les modifications sont effectuées via un appel ajax qui met à jour les propriétés de cet objet. Lorsque l'utilisateur a fini de travailler, j'ai un bouton de base "Enregistrer les modifications" qui lui permet de sauvegarder les données et de vider l'objet en cache.

Afin de protéger l'utilisateur, je souhaite les avertir s'il tente de quitter la page lorsque des modifications ont été apportées à l'objet serveur si elles n'ont pas été enregistrées. J'ai donc créé une méthode de service Web appelée IsInitialized qui renvoie true ou false selon que les modifications ont été enregistrées ou non. S'ils n'ont pas été enregistrés, je souhaite inviter l'utilisateur et lui donner la possibilité d'annuler sa demande de navigation.

Voici mon problème - même si les appels fonctionnent correctement, je ne parviens pas à obtenir l'appel à succès ajax pour définir la valeur de la variable sur sa fonction de rappel. Voici le code que j'ai maintenant.

   ////Catches the users to keep them from navigation off the page w/o saved changes...
window.onbeforeunload = CheckSaveStatus;
var IsInitialized;

function CheckSaveStatus() {

    var temp = $.ajax({
        type: "POST",
        url: "URL.asmx/CheckIfInstanceIsInitilized",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(result) {
            IsInitialized = result.d;
        },
        error: function(xmlHttpRequest, status, err) {
            alert(xmlHttpRequest.statusText + " " + xmlHttpRequest.status + " : " + xmlHttpRequest.responseText);
        }

    });

    if (IsInitialized) {
        return "You currently have unprocessed changes for this Simulation.";
    }
}

Je pense que je pourrais essayer d'utiliser le rappel de Success d'une manière inappropriée. Comment définir une variable javascript sur le rappel Success pour que je puisse décider si l'utilisateur doit être invité ou non au message des modifications non enregistrées?

Comme je viens de le dire, je fais un appel asynchrone, ce qui signifie que le reste du code est appelé avant que ma méthode ne revienne. Y a-t-il un moyen d'utiliser cet appel ajax, mais attrapez toujours l'événement window.onunload? (sans faire synchronos ajax)


35
2018-04-02 14:11


origine


Réponses:


Comme vous avez besoin de ce comportement dans l'événement de déchargement, vous devrez effectuer un appel synchrone à la place. Cependant, cela peut geler la fenêtre / l'onglet du navigateur en fonction de la durée de l'appel, mais parce que vous essayez effectivement d'empêcher l'utilisateur de fermer la fenêtre ...

Ajouter async: false à votre JSON pour effectuer un appel synchrone.


33
2018-04-02 14:40



Un exemple de page jquery:

var html = $.ajax({
  url: "some.php",
  async: false
 }).responseText;

La source: http://api.jquery.com/jQuery.ajax/


7
2017-11-14 01:30



La chose est que la demande à l'appel d'Ajax est asynchrone. Donc, au moment où vous vous vérifiez IsInitialized, l'appel n'est pas encore terminé.

Je suggère de spécifier votre comportement dans la fonction de réussite.

Fondamentalement, avoir des appels synchrones avec ajax est impossible sinon vraiment découragé.


4
2018-04-02 14:16



Vous pourriez théoriquement tuer l'événement (retourner false) et fermer la fenêtre en cas de succès, mais je pense que vous feriez des restrictions Javascript définies par certains utilisateurs, et que vous ne compreniez pas pourquoi leur fenêtre ne se ferme pas. Donc, je suis d'accord avec Pawel Krakowiak, l'appel ajax lui-même doit être synchrone.

J'ajouterai que vous voudrez notifier à l'utilisateur que vous vérifiez l'état (pas une fenêtre contextuelle, s'il vous plaît. Une de ces bannières de notification en haut de la fenêtre) et assurez-vous de définir $ .ajax "timeout" option à quelque chose de plus raisonnable pour cette situation, afin qu'ils n'attendent pas pour toujours la fermeture de la fenêtre.


2
2018-04-02 14:49



J'ai rencontré un problème similaire en essayant de définir une propriété pour un objet de données via le rappel réussi d'une requête ajax. En utilisant async: false n'a pas résolu mon problème non plus. Ce que j'ai fini par faire était d'utiliser un setTimeout appeler en dehors de l'appel ajax et définir la valeur du délai d'attente sur 1, comme ceci:

function getSessionid() {  
    $.ajax({  
        type: 'POST',  
        url: 'getSession.php',  
        dataType: 'text',  
        success: function(result){myData.sessionid = result;},   
        error: function(data) {alert("Error!\n" + data);} 
    });  
    setTimeout(function() {alert('sessionid = ' + myData.sessionid);},1);  
}  

Le seul retard de 1 milliseconde a fait toute la différence dans le monde. Sans elle, le sessionid La propriété ne serait pas définie en dehors de l'appel ajax, bien que les alertes dans le rappel indiquaient qu'elle était effectivement définie. C'est quelque chose à penser, si vous rencontrez un problème similaire.


2
2017-09-25 17:22



La meilleure approche pour moi est d'utiliser l'option async: false sur mon appel ajax. Bien que je comprenne les hésitations de Rashack à faire cela, je pense que cette situation justifie les moyens.

Jerph a également insisté sur le fait que je ne laisse pas l’utilisateur suspendu pendant que j'essaie de vérifier son statut. Cela couplé avec l'option de délai d'attente est important.

Merci à tous ceux qui ont commenté.


1
2018-04-02 15:20



vois ici:

http://groups.google.com/group/jquery-dev/browse_thread/thread/40d0e3def47148a0


0
2018-03-08 12:30