pandaa
@pandaa

Почему функция возвращает undefined?

function getFile(url) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            return(xhr.responseText);
        }
    }
    xhr.open('GET', url);
    xhr.send();
}
var res = getFile(url);
console.log(res); //Вывело undefined.

Хотя в консоле (XHR) показывает файл успешно.
  • Вопрос задан
  • 118 просмотров
Решения вопроса 2
v3shin
@v3shin
Веб-шаман
Сама функция getFile() не возвращает никакого значения - внутри нее нет return. Return в асинхронном ajax-запросе возвращает значение "в никуда".
Если вы хотите как-то использовать ответ ajax-запроса, используйте сразу. Например,

xhr.onreadystatechange = function () {
    if (xhr.readyState == 4 && xhr.status == 200) {
        console.log(xhr.responseText);
        document.getElementById('response').innerHTML = xhr.responseText;
        someOtherCallback(xhr.responseText);
    }
}
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Потому что асинхронность. Функция getFile завершает свою работу сразу после отправки запроса на сервер. После получения ответа будет вызвана анонимная каллбэк-функция xhr.onreadystatechange, из которой возвращать данные бесполезно, их никто не ждёт.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Для того чтобы был не undefined, необходимо использовать промисы

function getFile(url) {
    return new Promise((resolve, reject) => {
      const xhr = new XMLHttpRequest();
      xhr.open("GET", url);
      xhr.onreadystatechange = () => resolve(xhr.responseText);
      xhr.onerror = () => reject(xhr.statusText);
      xhr.send();
    });
}

getFile(url).then((res) => {
  console.log(res);
});


Также может пригодится конструкция async await
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
05 нояб. 2024, в 10:42
15000 руб./за проект
05 нояб. 2024, в 10:41
100000 руб./за проект