Используйте общую обработку ответа c для вызовов выборки - Reactjs - PullRequest
0 голосов
/ 16 июня 2020

Я не использую redux в своем приложении и использую fetch для вызова сервисов отдыха.

Я думал обрабатывать ответ на вызовы fetch в одном месте вместо дублирования кода.

I попытался сделать следующее в базовом классе:

handleResponse(response, isJson=true, isText=false) {
    // const contentType = response.headers.get("content-type");

    if (!response.ok) {

        // if (contentType && contentType.indexOf("application/json") !== -1) {
        if (isJson) {
            response.json().then(json => {
                return { 'ok': false, 'message': json.message }
            }).catch( reason => {
                return { 'ok': false, 'message': reason }
            })
        } else if (isText) {
            response.text().then((text) => {
                //console.log(error.message);
                return { 'ok': false, 'message': text }
            }).catch( reason => {
                return { 'ok': false, 'message': reason }
            });
        }

    } else {

        // if (contentType && contentType.indexOf("application/json") !== -1) {
        if (isJson) {
            response.json().then((data) => {
                return { 'ok': true, 'data': data }
            }).catch( () => {
                return { 'ok': true, 'data': undefined }
            });
        } else if (isText) {
            response.text().then((data) => {
                if (data === "true" || data === "false") {
                    return { 'ok': true, 'data': data === "true" }
                }
                return { 'ok': true, 'data': data }
            }).catch( () => {
                return { 'ok': true, 'data': undefined }
            });
        }

    }
}

и вызвать его таким образом из выборки:

return fetch(url,
        {
            method: 'POST',
            credentials: 'include',
            headers: headers
        }
    )
        .then((response) => this.handleResponse(response, true))
        .then( (handledResponse) => {
            console.log(handledResponse)
            return handledResponse
        })

        // .then((response) => {return response})

и использовать его в компоненте таким образом:

mycall(...).then((res) => {
            if (res.ok) {

Но handledResponse достигает значения undefined, поскольку вызов является асинхронным c и еще не завершился sh.

Есть ли стандарт для обработки ответа выборки? какова лучшая практика?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...