J'ai un widget JavaScript qui fournit des points d'extension standard. L'un d'eux est la beforecreate
fonction. Il doit revenir false
pour empêcher la création d'un élément.
J'ai ajouté un appel Ajax dans cette fonction en utilisant jQuery:
beforecreate: function (node, targetNode, type, to) {
jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
function (result) {
if (result.isOk == false)
alert(result.message);
});
}
Mais je veux empêcher mon widget de créer l'élément, donc je devrais revenir false
dans la fonction mère, pas dans le rappel. Existe-t-il un moyen d'effectuer une demande AJAX synchrone à l'aide de jQuery ou de toute autre API dans le navigateur?
javascript
jquery
ajax
asynchronous
Artem Tikhomirov
la source
la source
beforecreate
.Réponses:
Dans la documentation jQuery : vous spécifiez l' option asynchrone sur false pour obtenir une requête Ajax synchrone. Ensuite, votre rappel peut définir certaines données avant que votre fonction mère continue.
Voici à quoi ressemblerait votre code s'il était modifié comme suggéré:
la source
async: false
est toujours pris en charge dans jQuery> = 1.8. La capacité à utiliserasync: false
avec jqXHR ($.Deferred
) est ce qui était déconseillé. En d'autres termes, il faut utiliser les nouvelles options de rappel succès / erreur / complet, au lieu des méthodes héritées, par exemplejqXHR.done()
.Vous pouvez mettre la configuration Ajax de jQuery en mode synchrone en appelant
Et puis effectuez vos appels Ajax en utilisant
jQuery.get( ... );
Puis je le rallume une fois
Je suppose que cela fonctionne de la même manière que suggéré par @Adam, mais cela pourrait être utile à quelqu'un qui veut reconfigurer sa syntaxe
jQuery.get()
oujQuery.post()
lajQuery.ajax()
syntaxe plus élaborée .la source
$.ajax()
". ;)Excellente solution! J'ai remarqué lorsque j'ai essayé de l'implémenter que si je retournais une valeur dans la clause de réussite, elle revenait comme non définie. J'ai dû le stocker dans une variable et retourner cette variable. Voici la méthode que j'ai trouvée:
la source
getWhatever
. Ainsi vous n'avez rien retourné, c'estundefined
à dire de votregetWhatever
.Toutes ces réponses passent à côté du fait que faire un appel Ajax avec async: false provoquera le blocage du navigateur jusqu'à ce que la demande Ajax se termine. L'utilisation d'une bibliothèque de contrôle de flux résoudra ce problème sans raccrocher le navigateur. Voici un exemple avec Frame.js :
la source
la source
getURL
vsget
? Pourquoi on bloque mon navigateur?" etc.Remarque: vous ne devez pas utiliser
async: false
ce message d'avertissement:Chrome avertit même à ce sujet dans la console:
Cela pourrait casser votre page si vous faites quelque chose comme ça, car cela pourrait cesser de fonctionner n'importe quel jour.
Si vous voulez le faire d'une manière qui semble toujours synchrone mais qui ne bloque toujours pas, vous devez utiliser async / wait et probablement aussi un ajax basé sur des promesses comme la nouvelle API Fetch
Modifier Chrome travaille sur l' interdiction de la synchronisation XHR dans le rejet de page lorsque la page est en cours de navigation ou fermée par l'utilisateur. Cela implique avant le déchargement, le déchargement, le masquage de page et le changement de visibilité.
si tel est votre cas d'utilisation, vous voudrez peut-être jeter un œil à navigator.sendBeacon place
Il est également possible pour la page de désactiver la demande de synchronisation avec les en-têtes http ou l'attribut allow iframe
la source
await fetch(url)
appel dans untry... catch
bloc pour intercepter toutes les erreurs asynchrones.async
au début, vous pouvez donc simplement l'foo().catch(...)
attraper égalementbeforeunload
mais a ensuite annulé la modification après des commentaires négatifs bugs.chromium.org/p/chromium/issues/detail?id=952452Gardez à l'esprit que si vous effectuez un appel Ajax interdomaine (en utilisant JSONP ) - vous ne pouvez pas le faire de manière synchrone, l'
async
indicateur sera ignoré par jQuery.Pour les appels JSONP, vous pouvez utiliser:
la source
Avec
async: false
vous obtenez un navigateur bloqué. Pour une solution synchrone non bloquante, vous pouvez utiliser les éléments suivants:ES6 / ECMAScript2015
Avec ES6, vous pouvez utiliser un générateur et la bibliothèque commune :
ES7
Avec ES7, vous pouvez simplement utiliser asyc attendre:
la source
async function
à beforecreatebeforecreate: async function(....
et supprimer la fonction asynchrone auto-invoquéeJ'ai utilisé la réponse donnée par Carcione et l'ai modifiée pour utiliser JSON.
J'ai ajouté le dataType de 'JSON' et changé le .responseText en responseJSON .
J'ai également récupéré le statut en utilisant la propriété statusText de l'objet retourné. Notez qu'il s'agit de l'état de la réponse Ajax, et non de la validité du JSON.
Le back-end doit retourner la réponse dans un JSON correct (bien formé), sinon l'objet retourné ne sera pas défini.
Il y a deux aspects à considérer lors de la réponse à la question d'origine. L'une dit à Ajax de fonctionner de manière synchrone (en définissant async: false ) et l'autre renvoie la réponse via l'instruction return de la fonction appelante, plutôt que dans une fonction de rappel.
Je l'ai également essayé avec POST et cela a fonctionné.
J'ai changé le GET en POST et ajouté des données: postdata
Notez que le code ci-dessus ne fonctionne que dans le cas où async est faux . Si vous deviez définir async: true, l'objet renvoyé jqxhr ne serait pas valide au moment du retour de l'appel AJAX, uniquement plus tard lorsque l'appel asynchrone est terminé, mais il est beaucoup trop tard pour définir la variable de réponse .
la source
Voici un exemple:
la source
async false
avec une solution basée sur des promesses. Cela ne fait que verrouiller le navigateur sans aucun avantage.ajax
appels reviennent déjà) et.then()
oudone()
(comme il le montre déjà). Le verrouillage du navigateur est une expérience utilisateur très médiocre. Comme je l'ai dit, avoirasync: false
dans cet exemple est une perte de temps totale.Premièrement, nous devons comprendre quand nous utilisons $ .ajax et quand nous utilisons $ .get / $. Post
Lorsque nous avons besoin d'un contrôle de bas niveau sur la demande ajax, comme les paramètres d'en-tête de demande, les paramètres de mise en cache, les paramètres synchrones, etc., nous devrions opter pour $ .ajax.
$ .get / $. post: lorsque nous n'exigeons pas un contrôle de bas niveau sur la demande ajax.Seulement obtenir / publier les données sur le serveur. C'est un raccourci de
et donc nous ne pouvons pas utiliser d'autres fonctionnalités (synchronisation, cache, etc.) avec $ .get / $. post.
Par conséquent, pour un contrôle de bas niveau (synchronisation, cache, etc.) sur la demande ajax, nous devrions opter pour $ .ajax
la source
c'est ma simple implémentation pour les requêtes ASYNC avec jQuery. J'espère que cela aidera n'importe qui.
la source
Parce que le
XMLHttpReponse
fonctionnement synchrone est obsolète, j'ai proposé la solution suivante qui se termineXMLHttpRequest
. Cela permet des requêtes AJAX ordonnées tout en étant de nature asycrone, ce qui est très utile pour les jetons CSRF à usage unique.Il est également transparent afin que les bibliothèques telles que jQuery fonctionnent de manière transparente.
la source
Étant donné que la question d'origine portait sur
jQuery.get
, il convient de mentionner ici que (comme mentionné ici ), on pourrait l' utiliserasync: false
dans un$.get()
mais idéalement l'éviter car asynchroneXMLHTTPRequest
est déconseillé (et le navigateur peut donner un avertissement):la source
Défini
asyn:false
dans la requête ajax pour le rendre synchrone.Voici l'exemple de code:
Cela peut rendre l'écran insensible.
la source