mccrush
@mccrush
Vue.js Developer

Почему модуль JS возвращает undefined вместо строки?

При использовании модуля, если return стоит перед созданием xhr, то все работает отлично, модуль возвращает указанный результат. Если return стоит в операторных скобках else после проверки условия if (xhr.status != 200), возвращает undefined. В консоль выводит пришедшее значение с файла read.php (данные с сервера приходят типа string).

export function getData(type, table) {
  //return 'Name Site';
  let xhr = new XMLHttpRequest();
  xhr.open("POST", "crud/read.php", true);
  xhr.setRequestHeader(
    "Content-Type",
    "application/x-www-form-urlencoded"
  );

  xhr.send(
    "type=" +
    type +
    "&table=" +
    table
  );

  xhr.onreadystatechange = function () {
    if (xhr.readyState != 4) return;
    // Если есть ошибка, оповещаем об этом пользователя
    if (xhr.status != 200) {
      console.log("Errr " + xhr.status + ": " + xhr.statusText);
    } else {
      return xhr.responseText;
      //console.log(xhr.responseText);
    }
  };
}
  • Вопрос задан
  • 373 просмотра
Решения вопроса 1
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
function getData() {
  //...
  return new Promise((resolve, reject) => {
    xhr.onreadystatechange = function () {
        if (xhr.readyState != 4) reject(xhr.statusText);
        if (xhr.status != 200) {
          reject(xhr.statusText);
        } else {
          resolve(xhr.responseText);
        }
    };
    xhr.send();
  });
}

// use

getData()
  .then(function(response){
    console.log('Its OK', response);
  })
  .catch(function(errorText){
    console.log('Error:', errorText);
  });
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Ну так метод onreadystatechange асинхронный, т.е. он выполнится уже после вашего return. Поэтому используйте промисы, callback или async/await
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы