0

Есть функция getMessageText() которая создает AJAX-запрос и функция formatText() которая форматирует ответ запроса в строку и возвращает её как messageText. Вопрос в том, как мне записать в переменную внутри getMessageText значение которое возвращает formatText(), если formatText() это handler события?

function getMessageText() {
    let messageXHR = new XMLHttpRequest();

    messageXHR.open('get', 'http://www.randomtext.me/api/gibberish/p-1/10-45/');
    messageXHR.addEventListener('readystatechange', formatText);
    messageXHR.send();

    function formatText() {
        if (messageXHR.readyState != 4) {
            return;
        }

        if (messageXHR.status === 200) {
            let messageText = JSON.parse(messageXHR.responseText).text_out.slice(3, -5);

            return messageText;
        }
    }
}

Попробовал способ предложеный в комментариях. Не работает, так как запрос асинхронный, и сначала getMessageText() возвращает formattedMessage = undefined, а уже потом когда запрос окончен в formattedMessage записывается нужное значение. Использовать синхронный запрос не вариант, так как таких запросов возможно будет много.

function getMessageText() {
    let messageXHR = new XMLHttpRequest(),
        formattedMessage;

    messageXHR.open('GET', 'http://www.randomtext.me/api/gibberish/p-1/10-45/');
    messageXHR.addEventListener('readystatechange', formatText);
    messageXHR.send();

    function formatText() {
        if (messageXHR.readyState != 4) {
            return;
        }

        if (messageXHR.status === 200) {
            messageText = JSON.parse(messageXHR.responseText).text_out.slice(3, -5);
            formattedMessage = messageText;
        }
    }

    return formattedMessage;
}
  • 1
    Вы хотите сказать, что "handler события" не может записывать переменные? Объявляете переменную let formattedMessage; в функции getMessageText и в formatText определяете её значение formattedMessage = messageText. В чём проблема? – vihtor Jan 14 '18 at 13:15
  • Вы имеете ввиду записать в переменную которая находится в замыкании, да? Я не хотел сказать что "handler события" не может записывать переменные, а интерисовался можно ли записать возвращаемое из него значение в переменную. Спасибо, попробую сделать так. – Вадим Яровой Jan 14 '18 at 13:16
  • Вы же понимаете, что getMessageText возвращается до того, как отработает formatText. –  Jan 14 '18 at 14:12
  • @Igor Да, понимаю, я же это описал в вопросе. В этом и состоит проблема что мне нужно вернуть значение из getMessageText() после того как отработал formatText() – Вадим Яровой Jan 14 '18 at 14:25

0 Answers0