Je travaille sur une application de la fiole et il y a cette fonction JavaScript associée à un formulaire la fonction addcatalogfilters () est également un appel AJAX. Ces deux appels changent de variables du côté python des choses. Ce que je veux savoir, c'est si le premier appel AJAX (à addCatalogfilters) est garanti d'exécuter et de revenir avant le second. Je finis par des résultats étranges qui semblent être des conditions de course basées sur la commande des appels AJAX exécutés. Est-ce possible avec le code structuré comme celui-ci? Également, si oui, comment puis-je le réparer? P>
4 Réponses :
addCatalogfilters code> devrait retourner une promesse pour
attendre code> fonctionner; Il devrait également utiliser le mot-clé code> async code> (bien que cela soit moins important qui renvoie une promesse).
Vous avez raison. En utilisant le mot-clé code> async code> async code>, le retour sera toujours enveloppé à l'intérieur d'une promesse implicitement, ce qui devrait rendre la fonction en attente
Ce qui n'est toujours pas utile, car il a besoin d'attendre sur la promesse retournée Ajax, pas seulement la fin de la fonction. Devrait être explicitement noté ici.
Vous avez raison. Mal interprété ça. Cependant, le retour peut être placé dans le rappel du succès de la demande AJAX. Je sais qu'une fonction Async doit toujours avoir une valeur de retour pour chaque chemin, mais cela devrait renvoyer et déclencher ainsi la première fonction ASYNC à la fin de la demande AJAX.
Cela ne fonctionnera pas, vous avez besoin d'un retour ou attendez-vous devant $ .AJAX. Le retour vrai est enchaîné dans la promesse, mais la promesse générée par $ .ajax n'est jamais attendue par la fonction d'appel.
Vous pouvez vous assurer que la fonction de réussite d'AJAX. Appelez d'abord un AJAX (disons ajax1) appelez un autre appel AJAX dans la fonction de réussite de la première Call Ajax (fonction de réussite AJAX1). Ce n'est peut-être pas le moyen optimal. Mais garantir un appel Ajax est terminé avant d'appeler un autre. P> p>
En fonction de la manière dont l'application s'applique, vous devrez peut-être avoir un attendre ou ..quez-le où vous l'appelez. Notez que vous pouvez également utiliser "Résultat = Await AddCatalogfilters (CurrentCatalog)" pour mettre le résultat AJAX à un résultat variable que vous pouvez utiliser et passer à votre appel de votre $ .AJAX Appel dans ApplyBeeries. Je ne connais pas la nature de votre code, je ne peux donc pas faire de suggestions directes.
// Add user catalog filters
function addCatalogFilters() {
catalog = currentCatalog;
formData = new FormData(document.getElementById('catalogFilterForm'));
// return the Promise-like jqXHR object: https://api.jquery.com/jQuery.ajax/#jqXHR
return $.ajax({
type: 'POST',
url: "/addCatalogFilters",
data: formData,
processData: false,
contentType: false,
success: function (response){
document.getElementById(catalog + 'close').style.display = 'block';
document.getElementById(catalog + 'check').style.display = 'none';
addBtns = document.getElementsByClassName("addBtn");
removeBtns = document.getElementsByClassName("removeBtn");
for (i = 0; i < addBtns.length; i++) {
addBtns[i].style.display = "none";
removeBtns[i].style.display = "inline-block";
}
}
})
};
Vous pouvez utiliser permet de définir deux fonctions: p> Maintenant, vous pouvez vous assurer que async / attendre code>. Cependant, comme personne n'a mentionné, je voudrais démontrer comment vous pouvez y accomplir avec
prometteur code>.
second_function () code> est appelé qu'après l'exécution de
ajax code> demande dans
first_function () code> par approche suivante: p>
Passer un rappel sur
addCatalogfilters code>? Il n'est pas garanti de finir en premier sinon.
Ou a-t-il renvoyer la promesse, puis la consommez
$ .ajax renvoie un objet de promesse que vous pouvez .Chen et attendez-vous sur
En guise de tête, si vous êtes capable d'obtenir des appels de plusieurs utilisateurs (ou même le même utilisateur dans plusieurs navigateurs / onglets), cela peut entraîner les mêmes résultats étranges. Vous voudrez peut-être aussi regarder dans des options de synchronisation côté serveur ... Ils ont l'air assez simple, bien que je ne suis pas d'expert Python: docs.python.org/3.4/library/asyncio-sync.html
@Richard Williams veuillez poster une fonction addcatalogfilters afin que nous puissions mieux vous aider. Afin de s'assurer que les appels AJAX se produisent dans le bon ordre, un crochet est requis sur le (s) appel (s) AJAX à l'intérieur de AddCatalogfilters.
@ user120242 J'ai ajouté la fonction addcatalogfilters
@Richardwilliams Il y a des erreurs dans votre code que je n'ai pas correctement réparateur. Il ne montre que comment vous devriez utiliser l'attente pour vous assurer que l'appel AJAX est terminé avant que l'exécution continue. Par exemple, vous avez un support de fermeture manquant.