J'essaie d'appeler une action struts2 avec javascript synchronous j'ai trouvé plusieurs exemples mais aucun d'eux n'a fonctionné.

La seule chose que j'ai du travail est d'appeler l'action asynchrone comme ceci:

function toggel(id) {
    var url = "./ToggelProcess.action";
    $.post(url, {id : id}, function (resp) {
        // resp is the response from the server after the post request.
    });
}

Besoin d'un exemple comme celui-ci qui fonctionne.

0
John 5 mars 2016 à 19:12

3 réponses

Meilleure réponse

Je suggère que vous ne devriez jamais réellement avoir l'intention d'envoyer des demandes synchrones, car elles empêchent votre JS d'effectuer d'autres tâches pendant l'attente, car JS est monothread. Votre intention d'envoyer une demande synchrone rend vraiment probable que votre intention soit le résultat d'un manque de compréhension des demandes asynchrones ou le résultat d'une mauvaise conception. Au lieu de $.post, je suggère humblement $.ajax:

$.ajax({
  type: 'POST',
  url: url,
  data: {id : id},
  success: function (resp) {
        // resp is the response from the server after the post request.
  },
  async:false
});

Mais au lieu de cela, je vous suggère de repenser votre code, d'écrire des fonctions distinctes pour ce que vous avez l'intention d'exécuter lorsque la réponse arrive et de bloquer ces fonctions dans le rappel.

1
Lajos Arpad 5 mars 2016 à 16:43

Vous devez ajouter cette ligne à l'intérieur de votre fonction, cela rendra l'appel synchrone

$.ajaxSetup({async: false});

Comme ça

function toggel(id) {
 $.ajaxSetup({async: false});
    var url = "./ToggelProcess.action";
    $.post(url, {id : id}, function (resp) {
        // resp is the response from the server after the post request.
    });
}
0
user3662273 5 mars 2016 à 16:25

Ne faites pas d'appels synchrones, c'est fortement déconseillé car cela rend le navigateur insensible. Certains navigateurs comme Firefox ont rendu l'API synchrone obsolète.

Remarque: À partir de Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), les requêtes synchrones sur le thread principal ont été dépréciées en raison des effets négatifs sur l'expérience utilisateur.

Dans de rares cas, l'utilisation d'une méthode synchrone est préférable à une méthode asynchrone.

Cet exemple montre comment effectuer une demande synchrone simple.

var request = new XMLHttpRequest();
request.open('POST', 'ToggelProcess.action', false);  // `false` makes the request synchronous
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
request.send("id="+id);

if (request.status === 200) {
  console.log(request.responseText);
}
0
Roman C 5 mars 2016 à 18:35