Requête GET synchrone avec Javascript / jQuery

J’ai une fonction qui fait la demande ajax GET et basée sur la valeur renvoyée définit une variable JS globale. J’utilise cette variable (isCalculateTax dans le code ci-dessous) pour un traitement ultérieur:

var isCalculateTax; function setCalculateTaxValue(taxStatementId) { $.get('/taxstatements/calculatetax/' + taxStatementId, function (data) { isCalculateTax = data.isCalculateTax; }); } $(document).ready(function () { // initially check the tax statements dropdown to see which one is selected // and set the isCalculateTax to the right value var taxStatementId = $('#taxStatements').val(); setCalculateTaxValue(taxStatementId); enumerateDocumentItems(isCalculateTax); }); 

Mon problème est que, lorsque enumerateDocumentItems () est appelé et exécuté, la requête isCalculateTax n’est pas encore mise à jour à partir de la demande AJAX GET, je reçois donc des résultats imprévisibles.

Comment puis-je attendre le temps nécessaire avant d’exécuter enumerateDocumentItems () pour que isCalculateTax soit correct?

Il y a deux façons de faire ça. Tout d’abord, vous pouvez modifier setCalculateTaxValue (et probablement le renommer) afin qu’il accepte un rappel qui est exécuté lorsque la valeur est extraite. Vous passeriez alors enumerateDocumentItems tant que rappel. Alternativement, et ceci va vraiment à l’encontre du concept d’asynchronicité, vous pouvez le changer pour utiliser $.ajax et définir l’option aSync sur false. Je recommande l’ancien.

 var isCalculateTax; // no longer needed? function updateTaxValue(taxStatementId,callback) { $.get('/taxstatements/calculatetax/' + taxStatementId, function (data) { isCalculateTax = data.isCalculateTax; if (callback) { callback.call( taxStatementId, data.isCalculateTax ); } }); } $(document).ready(function () { // initially check the tax statements dropdown to see which one is selected // and set the isCalculateTax to the right value var taxStatementId = $('#taxStatements').val(); updateTaxValue(taxStatementId,enumerateDocumentItems); }); 

L’utilisation du rappel le rend un peu plus flexible que de simplement référencer la fonction de rappel directement. Cela vous permettra de réutiliser le code de mise à jour à plusieurs fins si nécessaire.

Appelez simplement enumerateDocumentItems () depuis la fonction de rappel $ .get, juste après que isCalculateTax soit défini.

Assurez-vous simplement que l’interface utilisateur a un sens entre les deux.