Как я хочу, чтобы мой код работал:
- Веб-сайт отправляет SQL-вставку в базу данных.(Я использую POST и Node.js)
- Веб-сайт ожидает rowID для записи базы данных, которая будет создана
- Node.js отправляет обратно только что вставленный rowID
- DOM обновлен
Как работает мой код:
- Веб-сайт отправляет SQL-вставку в базу данных.(Я использую POST и Node.js)
- Я написал функцию Sleep, потому что веб-сайт не ожидает rowID
- Node.js отправляет обратноrowID, который был только что вставлен
- DOM обновлен
Я думал, что правильно написал функцию обратного вызова, чтобы это работало.Тем не менее, DOM корректно обновляется только когда я создал функцию сна.Код, который я написал, чтобы заставить это работать, не является правильным способом реализовать это, и я хотел бы сделать это правильно.
//add a record to the table
function addRecord() {
event.preventDefault();
var newTech = document.getElementById("newTechnician");
if(newTech.elements.firstnameInput.value.length === 0 || newTech.elements.lastnameInput.value.length === 0 )
{
console.log("User didn't enter any data");
}
else {
//stackoverflow.com/questions/9713058/send-post-data-using-xmlhttprequest
var http = new XMLHttpRequest(),
method = 'POST',
url = '/tech';
//build the url
var usersInput = "type=insert&First_Name="+newTech.elements.firstnameInput.value+
"&Last_Name="+newTech.elements.lastnameInput.value;
http.open(method, url, true);
//Send the proper header information along with the request
http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
function updateDatabase (callback) {
http.send(usersInput);
http.onreadystatechange = () => callback();
}
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
function callbackFunction () {
//developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState
if(http.readyState == 4 && http.status == 200) {
if(http.status >= 200 && http.status < 400){
//added because callback isn't working correctly and isn't waiting until
//it receives a response with the rowID from Node.js/mySQL database
sleep(500);
//add the new row to the table
var response = JSON.parse(http.responseText);
//without the sleep function, id is undefined
var id = response.rowID;
var table = document.getElementById("technicianTable");
//-1 add record at the end of the table
var row = table.insertRow(-1);
var newTechID = document.createElement('td');
newTechID.textContent = id;
row.appendChild(newTechID);
var newFirstName = document.createElement('td');
newFirstName.textContent = newTechnician.elements.firstnameInput.value;
row.appendChild(newFirstName);
newTechnician.elements.firstnameInput.value = "";
var newLastName = document.createElement('td');
newLastName.textContent = newTechnician.elements.lastnameInput.value;
row.appendChild(newLastName);
newTechnician.elements.lastnameInput.value = "";
var newWorkoutDeleteCell = document.createElement('td');
var newWorkoutDeleteBtn = document.createElement('input');
newWorkoutDeleteBtn.setAttribute('type','button');
newWorkoutDeleteBtn.setAttribute('name','deleteButtonValue');
newWorkoutDeleteBtn.setAttribute('value','Delete');
newWorkoutDeleteBtn.setAttribute('onClick', 'deleteRecord(' + id + ')');
var deleteRowID = document.createElement('input');
deleteRowID.setAttribute('type','hidden');
deleteRowID.setAttribute('id', 'identifer' + id);
newWorkoutDeleteCell.appendChild(deleteRowID);
newWorkoutDeleteCell.appendChild(newWorkoutDeleteBtn);
row.appendChild(newWorkoutDeleteCell);
}
}
};
updateDatabase(callbackFunction);
}
}