AJAX déclenchent le script à distance puis vérifient la réussite-réponse

J’ai fouillé mes cerveaux mais je n’arrive pas à comprendre le peu d’aide que je trouve.

J’exécute une firebase database alimentée par les données d’une autre firebase database. Le transport csv est géré par un serveur tiers fournissant des “stream” exécutables qui comstacknt et transmettent les données.

J’ai un script php pour gérer la demande (impossible à faire directement via Javascript à cause de l’en-tête manquant ‘Access-Control-Allow-Origin’) Mais cela fonctionne bien. Je peux déclencher le stream.

Ce n’est pas le problème cependant. Ce que je veux faire: déclencher le stream @onClick d’un bouton avec quelque chose comme ceci:

function sortinggger_func(flowID) { $.ajax({ url: './ajaxPHP_handler.php', data: "flowid="+flowID, dataType: 'json', success: function(result) { var jsonResult = jQuery.parseJSON(result); console.log(jsonResult.runID); } }); } 

Avec le flowID et le runID résultant, je veux vérifier comme chaque seconde ou presque.

 function check_status(flowID, runID) { $.ajax({ url: './ajaxPHP_handler.php', data: "flowid="+flowID+"&action=status&runId="+runID, dataType: 'json', success: function(result){...} }); } 

Cela retournera le statut / la progression du stream. Il démarrera pendant quelques secondes avec status == null, puis passera à status == ‘en cours d’exécution’ et enfin status == ‘success’. J’ai obtenu check_status () à exécuter 15 fois avec un setTimeout dans une boucle for de la fonction de réussite de sortinggger_func (), et tout fonctionne correctement. Mais je ne peux pas pendant toute ma vie comprendre comment je lierais ce matériel pour qu’il vérifie jusqu’à l’obtention du statut «succès», puis cesser de vérifier, mettre à jour le contenu de la page, etc.

J’ai aussi sortingpoté quelque chose comme

 sortinggger_func(id).done(function(result){ console.log(result); }); 

Cela fonctionne aussi, mais je ne peux toujours pas penser plus loin en vérifiant chaque seconde jusqu’à «succès». Je suppose que cela revient à remettre la variable ‘statut’ dans ma boucle afin que je puisse la casser.

Peut-être que quelqu’un connaît un exemple compréhensible quelque part en ligne …

Vous pouvez faire ceci:

 function periodically_check_status_until_success(flowID, runID) { setTimeout(function() { $.ajax({ url: './ajaxPHP_handler.php', data: { flowid: flowID, action: status, runId: runID }, dataType: 'json', success: function(result){ if (result != 'success') { periodically_check_status_until_success(flowID, runID); } } }); }, 5000); // Five seconds } 

Remarque: vous pouvez utiliser un object pour l’option data plutôt que de concaténer vous-même la chaîne.

Alors continuez à l’appeler

 var flowID, runID; function sortinggger_func(flowID) { $.ajax({ url: './ajaxPHP_handler.php', data: "flowid="+flowID, dataType: 'json', success: function(result) { var jsonResult = jQuery.parseJSON(result); runID= jsonResult.runID; check_status(); } }); } function check_status() { $.ajax({ url: './ajaxPHP_handler.php', data: "flowid="+flowID+"&action=status&runId="+runID, dataType: 'json', success: function(result){ if (result is not what you want) { setTimeout(check_status,1000); } } }); } 

les ajax sont asynchrones, vous devez donc gérer cela via une variable tierce

Comme Init avec la valeur 0

 var _status = 0 

que de le changer lors de votre premier appel 1

 function sortinggger_func(flowID) { $.ajax({ url: './ajaxPHP_handler.php', data: "flowid="+flowID, dataType: 'json', success: function(result) { var jsonResult = jQuery.parseJSON(result); console.log(jsonResult.runID); check_status(flowID, runID); } }); } function check_status(flowID, runID) { $.ajax({ url: './ajaxPHP_handler.php', data: "flowid="+flowID+"&action=status&runId="+runID, dataType: 'json', success: function(result){ //at end status=='success'. if(status=='success'){ // end part }else{// running check_status(flowID, runID); } // clear timeout will stop that time interval after success } }); }