Dz13 js.html 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. body {
  10. display: flex;
  11. flex-direction: column;
  12. }
  13. .msg-container {
  14. display: flex;
  15. flex-direction: column;
  16. width: 400px;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <form>
  22. <input type="text" id="login" placeholder="Name" />
  23. <input type="text" id="message" placeholder="Message" />
  24. <button id="btn">Send</button>
  25. </form>
  26. <div class="msg-container"></div>
  27. <script>
  28. const url = "http://students.a-level.com.ua:10012";
  29. const msgContainer = document.querySelector('.msg-container');
  30. const login = document.querySelector('#login');
  31. const message = document.querySelector('#message');
  32. const btn = document.querySelector('#btn');
  33. let messageId = 0;
  34. async function jsonPost(url, data) {
  35. try {
  36. const response = await fetch(url, {
  37. method: "POST",
  38. body: JSON.stringify(data),
  39. });
  40. const result = response.json();
  41. return response.ok ? result : new Error("status is not 200");
  42. } catch (error) {
  43. return new Error("jsonPost failed");
  44. }
  45. }
  46. async function sendMessage() {
  47. jsonPost(url, {
  48. func: "addMessage",
  49. nick: login.value,
  50. message: message.value,
  51. });
  52. }
  53. async function getMessages() {
  54. let a = await jsonPost(url, {
  55. func: "getMessages",
  56. nick: login.value,
  57. message: message.value,
  58. messageId: messageId,
  59. });
  60. let msgArray = a.data;
  61. msgArray.forEach(msg => {
  62. const text = document.createElement("p")
  63. messageId = a.nextMessageId;
  64. text.innerHTML = `(ID:${messageId}) ${msg.nick}: ${msg.message}`
  65. msgContainer.prepend(text)
  66. });
  67. }
  68. btn.onclick = async function sendAndCheck(e) {
  69. e.preventDefault();
  70. await sendMessage()
  71. await getMessages()
  72. }
  73. const delay = (ms) => new Promise((resolve) => setTimeout(() => resolve(ms), ms));
  74. (async function checkLoop() {
  75. while (true) {
  76. await delay(3000);
  77. getMessages();
  78. }
  79. })();
  80. //async function sendMessage(nick, message) отсылает сообщение.
  81. //async function getMessages() получает сообщения и отрисовывает их в DOM
  82. //async function sendAndCheck() использует две предыдущие для минимизации задержки между отправкой сообщения и приходом их.Именно эта функция должна запускаться по кнопке.
  83. //async function checkLoop() использует delay и бесконечный цикл для периодического запуска getMessages().
  84. </script>
  85. </body>
  86. </html>