Как получить данные с сервера на чистом js?

В функции GetWord получаю информацию с сервера в формате json.

function getWord(){
    const request = new XMLHttpRequest();
    const url = "get-word.php";
    request.responseType = "json";
    request.open("POST", url, true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.send();
    console.log(request);
    console.log(request.response);
    return request.response;
}

Проблема заключается в том что при выводе в консоль объекта request все так как надо:

XMLHttpRequest
    onabort: null
    onerror: null
    onload: null
    onloadend: null
    onloadstart: null
    onprogress: null
    onreadystatechange: null
    ontimeout: null
    readyState: 4
    response: {id: "1", ru: "зима", en: "winter", rate: "0"}
    responseText: (...)
    responseType: "json"
    responseURL: "http://dictionary/get-word.php"
    responseXML: (...)
    status: 200
    statusText: "OK"
    timeout: 0
    upload: XMLHttpRequestUpload {onloadstart: null, onprogress: null, onabort: null, onerror: null, onload: null, …}
    withCredentials: false
    __proto__: XMLHttpRequest

а когда я хочу получить request.response возвращается null. Помогите разобраться, пожалуйста


Ответы (3 шт):

Автор решения: Aziz Umarov

Дело в том что данные XMLHttpRequest можно будет получить в onload методе. В вашем случае вы отправляете запрос и тут же хотите ответ это не php а JavaScript он хоть и однопоточный но все же асинхронный. Хотите синхронно то поставьте 3 параметр в open false.

request.open("POST", url, false);

→ Ссылка
Автор решения: MoloF

async function getWord() {
    const options = {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' }
    };

    try {
        return await fetch('get-word.php', options);
    } catch (error) {
        console.log(error.message);
    }
}

(async function() {
    const words = await getWord();
    console.log(words);
})();

function getWord() {
    const options = {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' }
    };
    
    return new Promise((resolve, reject) => {
        fetch('get-word.php', options)
            .then(response => resolve(response))
            .catch(error => reject(error));
    });
}

(function() {
    getWord()
        .then(response => console.log(response))
        .catch(error => console.log(error.message));
})();

→ Ссылка
Автор решения: Djabrail Gadjimuradov
fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())
  .then(json => console.log(json))
→ Ссылка