async function jsonPost(url, data) { let resp = await fetch(url, { method: 'POST', body: JSON.stringify(data) }) return await resp.json() // return new Promise((resolve, reject) => { // var x = new XMLHttpRequest(); // x.onerror = () => reject(new Error('jsonPost failed')) // //x.setRequestHeader('Content-Type', 'application/json'); // x.open("POST", url, true); // x.send(JSON.stringify(data)) // x.onreadystatechange = () => { // if (x.readyState == XMLHttpRequest.DONE && x.status == 200) { // resolve(JSON.parse(x.responseText)) // } // else if (x.status != 200) { // reject(new Error('status is not 200')) // } // } // }) } let messageIdSave = 0; async function getMessages(nextMessageId) { let youtubeRegExp = /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?/ let imageRegExp = (/\.(gif|jpg|jpeg|tiff|png)$/i) let arrObj = await jsonPost("http://students.a-level.com.ua:10012", { func: 'getMessages', messageId: nextMessageId }) arrObj.data.map(t => { let box = document.createElement('div') box.classList.add('box') let nick = document.createElement('span') nick.classList.add('nick') let message = document.createElement('p') message.classList.add('message') nick.innerText = t.nick + ':' let keyRegYoutube = t.message ? t.message.match(youtubeRegExp) : null if (keyRegYoutube) { message.innerHTML = `` } else if (imageRegExp.test(t.message)) { message.innerHTML = `` } else { message.innerText = t.message } box.append(nick) box.append(message) historyChat.prepend(box) }) messageIdSave = arrObj.nextMessageId } async function sendMessage(nickName, message) { await jsonPost("http://students.a-level.com.ua:10012", { func: 'addMessage', nick: nickName, message: message }) } async function sendAndCheck(nickName, message, nextMessageId) { await sendMessage(nickName, message) await getMessages(nextMessageId) } btn.onclick = () => { nick.value === '' ? nick.classList.add('error') : message.value === '' ? message.classList.add('error') : sendAndCheck(nick.value, message.value, messageIdSave) message.value = '' } nick.oninput = () => nick.classList.remove('error') message.oninput = () => message.classList.remove('error') async function checkLoop() { const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms)) while (true) { await delay(3000) getMessages(messageIdSave) } } checkLoop()