Как обернуть выборку JavaScript в функцию - необработанное отклонение обещания - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь написать функцию-обертку для команды JavaScript fetch.

Я взял пример кода из этого поста :

function fetchAPI(url, data, method = 'POST') {
const headers = {
    'Authorization': `Token ${getAuthToken()}`,
};

return fetch(url, { headers, 'method': method, 'body': data })
    .then(response => {
        if (response.ok) {
            const contentType = response.headers.get('Content-Type') || '';

            if (contentType.includes('application/json')) {
                return response.json().catch(error => {
                    return Promise.reject(new Error('Invalid JSON: ' + error.message));
                });
            }

            if (contentType.includes('text/html')) {
                return response.text().then(html => {
                    return {
                        'page_type': 'generic',
                        'html': html
                    };
                }).catch(error => {
                    return Promise.reject(new Error('HTML error: ' + error.message));
                });
            }

            return Promise.reject(new Error('Invalid content type: ' + contentType));
        }

        if (response.status === 404) {
            return Promise.reject(new Error('Page not found: ' + url));
        }

        return response.json().then(res => {
            // if the response is ok but the server rejected the request, e.g. because of a wrong password, we want to display the reason
            // the information is contained in the json()
            // there may be more than one error
            let errors = [];
            Object.keys(res).forEach((key) => {
                errors.push(`${key}: ${res[key]}`);
            });
            return Promise.reject(new Error(errors)
            );
        });
    }).catch(error => {
        return Promise.reject(new Error(error.message));
    });

};

И я называю это так:

fetchAPI('/api/v1/rest-auth/password/change/', formData).then(response => {
        console.log('response ', response);
    });

Редактировать: я изменил код для отображения информации, возвращаемой сервером, если запрос в порядке, но отклонен, например, из-за неверного пароля. Вы должны запросить ответ JSON, если все в порядке == false.

Допустима правильная загрузка URL. Но если есть ошибка, я вижу необработанное отклонение (ошибка): сообщение об ошибке.

Почему отказы не обрабатываются, даже если они находятся в уловах? Что за секретный соус здесь?

1 Ответ

0 голосов
/ 07 января 2019

Чтобы избежать необоснованного отклонения обещания, нужно обработать его:

fetchAPI('/api/v1/rest-auth/password/change/', formData).then(response => {
    console.log('response ', response);
}).catch(error => {
   // do something meaningful here.
});;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...