Филипп Робертс рассказывает о понятии event loop в javascript, которое полезно понимать для использования AJAX.
Javascript – однопоточный язык программирования с единичным последовательным исполнением операций.
Event loop наблюдает за stack и callback queue (сюда попадают задачи из webapi, например после окончания таймера в setTimeout попадет вызов функции). Если stack пуст, то event loop перемещает первую задача в stack, который ее выполняет. Визуализация.
Для тестовых запросов удобно использовать JSONPlaceholder. Это бесплатные REST API с шестью разными видами фэйковых данных: посты, комментарии, альбомы, фотографии, список задач(todo) и пользователи.
Для просмотра json в браузере думаю полезным будет раcширение json-viewer.
Пример запросов на сервер с использованием класса XMLHttpRequest (XHR):
const requestUrl = "https://jsonplaceholder.typicode.com/posts";
function sendRequest(method, url, body = null){
//конструктор промиса
return new Promise((resolve, reject) => {
//конструктор глобального класса
const xhr = new XMLHttpRequest()
//конфиг запроса
xhr.open(method, url)
//парсер строки в json
xhr.responseType = 'json'
//
xhr.setRequestHeader('Content-Type', 'application/json')
//слушатель любого ответа сервера
xhr.onload = () => {
if (xhr.status >= 400) {
reject('Ошибка ' + xhr.status + ': ' + xhr.statusText)
} else {
resolve(xhr.response)
}
}
//слушатель ошибок соединения
xhr.onerror = () => {
reject('Запрос не удался')
}
//отправляет запрос
xhr.send(JSON.stringify(body))
})
}
//get-запрос
sendRequest('GET', requestUrl)
.then(data => console.log(data))
.catch(err => console.error(err));
const newPost = {
'userId': 4382,
'title': 'Заголовок публикации',
'body': 'Текстовоей наполнение записи'
}
//post-запрос
sendRequest('POST', requestUrl, newPost)
.then(data => console.log(data))
.catch(err => console.error(err));
Пример запросов с использованием браузерного Api – метод fetch():
const requestUrl = "https://jsonplaceholder.typicode.com/posts";
function sendRequest(method, url, body = null){
const headers = {
'Content-Type': 'application/json'
}
//возвращает промис-объект
return fetch(url, {
method: method,
body: JSON.stringify(body),
headers: headers,
}).then(response => {
if (response.ok) {
return response.json()
} else {
return.json().then(error => {
const e = new Error('Ошибка')
e.data = error
throw e
})
}
})
}
//get-запрос
sendRequest('GET', requestUrl)
.then(data => console.log(data))
.catch(err => console.error(err));
const newPost = {
'userId': 4382,
'title': 'Заголовок публикации',
'body': 'Текстовоей наполнение записи'
}
//post-запрос
sendRequest('POST', requestUrl, newPost)
.then(data => console.log(data))
.catch(err => console.error(err));