Не могу найти ошибку в коде промиса

125
10 января 2020, 16:30

ссылка с кодом

const callBack = () => {
    let inputRub = document.getElementById('rub'),
            inputUsd = document.getElementById('usd');
    inputRub.addEventListener('input', () => {
        const promise = (url) => {
            return new Promise((resolve, reject) => {
                let request = new XMLHttpRequest();
                request.open('GET', url);
                request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
                request.addEventListener('readystatechange', function() {
                    if (this.readyState === 4 && this.status == 200) {
                        resolve(this.response);
                    }
                    else {
                        reject();
                    }
                });
                request.send();
            });
        };
        promise('js/current.json')
            .then((response) => {
                let data = JSON.parse(response);
        inputUsd.value = (inputRub.value / data.usd).toFixed(3);
            })
            .catch((error) => {
                inputUsd.value = "Что-то пошло не так!";
            });
    });
};
callBack();

этот конвертер должен брать значение с current.json такого содержания

{
    "usd": 68
}

и переводить, но при запросе получается код 304 и промис переходит в reject.

Я только начал изучать промисы и не могу понять, где я допустил ошибку

Answer 1

ошибка заключается в неверной реализации обработчика .addEventListener('readystatechange'

В процессе выполнения запроса статус и readyState меняется несколько раз. В текущем же коде:

if (this.readyState === 4 && this.status == 200) {
    resolve(this.response);
}
else {
    reject();
}

Promise переходит в состояние rejected при первом же заходе, если readyState не равен 4.

Для решения достаточно перенести проверку условия внутрь:

if (this.readyState === 4) {
    if (this.status == 200) {
        resolve(this.response);
    }
    else {
        reject();
    }
}
READ ALSO
ServiceWorker, PushManager - неопределенная ошибка

ServiceWorker, PushManager - неопределенная ошибка

Постигаю азы использования ServiceWorker и Push API - есть такой код:

151
Сортировка списка HTML по буквам на Javascript

Сортировка списка HTML по буквам на Javascript

Я пробую делать русско-португальский словарь с помощью виджета AccordionКаждая словарная статья в своём ящике, которая откроется по щелчку

147
В чем ошибка в данном коде?

В чем ошибка в данном коде?

Текст задачи: You probably know the "like" system from Facebook and other pagesPeople can "like" blog posts, pictures or other items

141