J'ai donc cette fonction et je veux que le programme attende qu'il renvoie une valeur au lieu de donner une valeur indéfinie.
document.getElementById('demo').innerHTML = 'test' + savedNumberOfLessonInDay(number);
<?php
require '../notWebsite/dbh.php';
session_start();
$dayID = (int)$_GET['GETDayID'];
$sqlCount = "SELECT COUNT(lessonID) FROM daylesson WHERE dayID = ?";
$stmt = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt, $sqlCount)) {
header("Location: ../GymnasieArbeteHemsida.php?error=countError");
exit();
}
else {
mysqli_stmt_bind_param($stmt, "i", $dayID);//Puts in variable in question
mysqli_stmt_execute($stmt);//Executes the question
mysqli_stmt_bind_result($stmt, $result);//Binds the reuslt of the question to the variable $result
if(mysqli_stmt_fetch($stmt)){//If the result of the question can be recieved
echo $result;//Send the result to the website
}
exit();
}
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>
function savedNumberOfLessonInDay(dayID){
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById('demo4').innerHTML = this.responseText; //Returns the right number
return this.responseText;
}
};
var PageToSendTo = "AJAX/countLessonInDay.php?";
var MyVariable = dayID;
var VariablePlaceholder = "GETDayID=";
var UrlToSend = PageToSendTo + VariablePlaceholder + MyVariable;
xhttp.open("GET", UrlToSend, false);
xhttp.send();
}
Ce code renvoie test non défini à demo mais 16 (qui est le nombre que je cherche) à demo4. Comment puis-je faire en sorte qu'il renvoie test16 en démo au lieu de testundefined?
3 Réponses :
Vous ne pouvez pas appeler savedNumberOfLessonInDay (number) pour obtenir le numéro. Vous essayez de le faire en utilisant return this.responseText; , mais cela ne se déclenchera que lorsque la requête au serveur sera terminée.
Vous pouvez utiliser Promises pour résoudre ce problème.
savedNumberOfLessonInDay(number).then((response) => {
document.getElementById('demo').innerHTML = 'test' + response;
});
Et utilisez await pour l'appeler:
document.getElementById('demo').innerHTML = 'test' + await savedNumberOfLessonInDay(number);
Ou, si pour une raison quelconque vous ne pouvez pas utilisez await:
function savedNumberOfLessonInDay(dayID){
return new Promise((resolve) => {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById('demo4').innerHTML = this.responseText; //Returns the right number
resolve(this.responseText);
}
};
var PageToSendTo = "AJAX/countLessonInDay.php?";
var MyVariable = dayID;
var VariablePlaceholder = "GETDayID=";
var UrlToSend = PageToSendTo + VariablePlaceholder + MyVariable;
xhttp.open("GET", UrlToSend, false);
xhttp.send();
});
}
La fonction savedNumberOfLessonInDay () n'attendra pas la fin de l'ajax. Vous devez donc définir le code HTML pour la démonstration dans la fonction de rappel xhttp.onreadystatechange.
Sans trop changer votre implémentation, vous pouvez simplement modifier votre code:
savedNumberOfLessonInDay(number);
}
Et puis appelez simplement la fonction au lieu de essayer de définir le
function savedNumberOfLessonInDay(dayID){
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById('demo4').innerHTML = this.responseText; //Returns the right number
document.getElementById('demo').innerHTML = 'test' + this.responseText;
}
};
var PageToSendTo = "AJAX/countLessonInDay.php?";
var MyVariable = dayID;
var VariablePlaceholder = "GETDayID=";
var UrlToSend = PageToSendTo + VariablePlaceholder + MyVariable;
xhttp.open("GET", UrlToSend, false);
xhttp.send();
essayez d'utiliser async / await voici comment l'utiliser. https://javascript.info/async-await
Veuillez n'utiliser les liens qu'à titre de référence.