Проверка формы, содержащая api выборки

#javascript #fetch-api

#язык JavaScript #fetch-api

Вопрос:

У меня есть простая форма, в которой я хотел бы проверить наличие действительных данных перед отправкой и сохранением данных.

Однако из-за fetch(...) асинхронности я не могу остановить проверку и дождаться результата.

Есть ли способ остановить асинхронность выборки?
Или, может быть, это лучший способ сделать это?

 form.addEventListener('submit', (event) =gt; {  fetch(`/check?id=${id}`)  .then((res) =gt; res.json())  .then((json) =gt; {  if (json.error) {  // Prevent the submit here  // event.preventDefault();  }  }); });  

Комментарии:

1. добавьте event.preventDefault() перед вызовом в fetch() . Без этого форма отправляется независимо от успеха или неудачи выборки.

2. @RandyCasburn Если выборка не возвращает ошибку, я бы хотел, чтобы форма отправлялась нормально. Разве ваше предложение не остановило бы форму полностью?

3. Если проверка проверки в любом случае выполняется на стороне сервера, зачем делать это в двух отдельных запросах? С таким же успехом вы могли бы выполнить проверку одновременно с сохранением. Если безопасность и целостность данных важны, ваша конечная точка «сохранения» всегда должна проверять входные данные самостоятельно. В противном случае кто-то может обойти вашу конечную точку проверки и напрямую попасть в конечную точку сохранения, а также повредить данные. Есть ли у вас контроль над конечной точкой сохранения?

4. После успешной проверки на стороне клиента все, что вам нужно сделать, это сделать form.submit() . Это оно.

5. @DSander Да, проверка также выполняется на стороне сервера, так что это, безусловно, вариант. Тем не менее, я хотел сделать более удобный для пользовательского интерфейса метод. Вместо того, чтобы всегда вызывать перезагрузку страницы.

Ответ №1:

Если вам нужен удобный пользовательский интерфейс, вы можете добавить прослушиватели onfocusout() или onblur() в каждое поле формы и проверять каждый ввод по мере их ввода. Вы можете отключить кнопку «Отправить» для формы по умолчанию и включить ее только после прохождения всех проверок. Что — то вроде этого:

 function validateId() {  let id = document.forms.myForm.id.value;  if(id === ""){  document.forms.myForm.submit.disabled = true;  return;  }  fetch(`https://api.github.com/users/${id}/repos`)  .then((res) =gt; res.json())  .then((json) =gt; {  if (json.error) {  // fail validation  alert("Failed!");  document.forms.myForm.submit.disabled = true;  } else {  // success  document.forms.myForm.submit.disabled = false;  }  })  .catch(error =gt; {  alert("Error! "   error);  document.forms.myForm.submit.disabled = true;  });   } 
 lt;form name="myForm" action="/action_page.php" method="post"gt;  ID: lt;input type="text" name="id" onfocusout="validateId()"gt;  lt;input type="submit" name="submit" value="Submit" disabledgt; lt;/formgt;