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) показывает файл успешно.
  • Вопрос задан
  • 113 просмотров
Решения вопроса 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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
summer Ярославль
от 100 000 до 140 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
19 апр. 2024, в 20:43
20000 руб./за проект
19 апр. 2024, в 20:11
500 руб./за проект