Je travaille sur un projet de classe et je suis à peu près un débutant absolu dans ce genre de choses. J'ai un serveur fonctionnant sur Ubuntu. A l'intérieur de script.js j'ai

$(document).ready(function(){
    $.get('/var/www/html/hadoopstatus.txt', function(response) {
        var $hadoopstatus = response;
    }, "text");
    if ($hadoopstatus == 'Running'){
        document.getElementById('b2').disabled = false;
    }
    if ($hadoopstatus == 'Stopped'){
        document.getElementById('b1').disabled = false;
    }
});

Et dans index.html j'ai

<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script src="script.js"></script>
// some stuff
</head>

<body>
// stuff
<form method="post">
<button type="submit" id="b1" disabled>Start Hadoop</button>
<button type="submit" id="b2" disabled>Stop Hadoop</button>
</form>
// stuff
</body>

/var/www/html/hadoopstatus.txt contient uniquement

Running

Le problème que j'ai, c'est que les boutons, dans ce cas le bouton "Stop Hadoop", ne seront pas activés. Qu'est-ce que je fais mal?

0
Tauschung 8 mars 2016 à 00:19

3 réponses

Meilleure réponse

Une autre solution possible est:

$(function() {
  $.get('hadoopstatus.txt', function(response) {
    switch (response.trim()) {
      case 'Running':
        document.getElementById('b2').disabled = false;
        break;
      case 'Stopped':
        document.getElementById('b1').disabled = false;
        break;
    }
  }, "text");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>

<form method="post">
    <button type="submit" id="b1" disabled>Start Hadoop</button>
    <button type="submit" id="b2" disabled>Stop Hadoop</button>
</form>

Évaluez la réponse dans la fonction .get. Il s'agit d'une fonction asynchrone.

0
gaetanoM 7 mars 2016 à 21:35

La fonction $ .get est asynchrone, vous devez donc attendre qu'elle se termine.

Alors changez votre code en:

 $.get('/var/www/html/hadoopstatus.txt', function(response) {
   var $hadoopstatus = response;
   if ($hadoopstatus == 'Running') {
     document.getElementById('b2').disabled = false;
   }
   if ($hadoopstatus == 'Stopped') {
     document.getElementById('b1').disabled = false;
   }
 }, "text");

Pour un contrôle complet:

var jqxhr = $.get('/var/www/html/hadoopstatus.txt', function(response) {
  alert( "success" );

  if (response == 'Running') {
     document.getElementById('b2').disabled = false;
   }
   if (response == 'Stopped') {
     document.getElementById('b1').disabled = false;
   }


}, "text")
  .done(function() {
    alert( "second success" );
  })
  .fail(function() {
    alert( "error" );
  })
  .always(function() {
    alert( "finished" );
  });
1
irfan 7 mars 2016 à 21:33

Vous avez deux problèmes. La première est que vous avez défini la variable $hadoopstatus dans votre fonction de rappel. Une fois la fonction de rappel terminée, la variable sera effacée. Mais un autre problème plus grave est que vous passez un appel AJAX qui pourrait prendre quelques secondes. Mais immédiatement après avoir lancé cet appel, vous vérifiez la valeur de $hadoopstatus.

Il s'agit d'un problème avec la programmation asynchrone. Vous devez vous rappeler que les appels AJAX se termineront un certain temps après l'avoir lancé. C'est pourquoi il existe une fonction de rappel. Ce code s'exécutera lorsque l'appel AJAX aura terminé de charger les données ... que ce soit quelques millisecondes ou 10 secondes.

J'ai ajusté votre code pour intégrer toute la logique métier dans votre fonction de rappel. Lorsque l'appel AJAX est terminé, il crée la variable $hadoopstatus à partir de la réponse, puis vérifie la valeur et désactive le bouton approprié.

$(document).ready(function(){
    $.get('/var/www/html/hadoopstatus.txt', function(response) {
        var $hadoopstatus = response;
        if ($hadoopstatus == 'Running'){
            document.getElementById('b2').disabled = false;
        }
        if ($hadoopstatus == 'Stopped'){
            document.getElementById('b1').disabled = false;
        }
    }, "text");

});

N'oubliez pas que la valeur de $hadoopstatus ne sera pas disponible en dehors de cette fonction car vous avez créé le "var" à l'intérieur de la fonction. Lorsque la fonction est terminée, la variable l'est également. Si vous utilisez la commande "var" avant l'appel AJAX, vous aurez toujours un problème car elle ne contiendra peut-être pas la valeur lorsque votre code essaiera de l'exécuter en raison du délai de chargement. En d'autres termes, soyez prudent lorsque vous vous attendez à ce que votre appel AJAX soit instantané. Ce ne sera probablement pas le cas.

0
Dr. Cool 7 mars 2016 à 21:31