обещание извлечения не разрешается должным образом - PullRequest
0 голосов
/ 08 мая 2018

Итак, у меня есть этот метод, который я использую для вызова универсального метода выборки, который я определил в отдельном файле js:

export function detailedView(request,token)
{
    let endpoint = 'api/v1/cbn/inventory/GetDetailRequest?RequestNo='+request['RequestNo'];

    let header = {
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": "Bearer "+ token
    }

    return dispatch => {
        return fetchAPI(endpoint,'POST', header, null)
        .then((json) => {
            dispatch(receiveDetails()); 
        })
        .catch((error) => {     //PROBLEM IS HERE
            console.log("error message: " + error);
            dispatch(receiveEmptyDetails());
        });
    }
}

отмеченное место в этом коде всегда вызывается по какой-то причине, хотя функция fecth ниже всегда заканчивается в месте, отмеченном ниже:

export function fetchAPI(endpoint, method, header, data) {
    let url = 'http://10.64.2.149:8082/' + endpoint;

    let options = {
            method: method,
            headers: header,
            body: stringify(data)
          };

    return fetch(url, options)
        .then(response => {
            return response.json()
                .then((json) => {
                    console.log(json, response) //AT THIS POINT RESPONSE STATUS IS 200, SHOWN IN THE SCREENCAP BELOW
                    if (response.status === 200 || response.status === 201) {
                        return json; 
                    } else if (response.status === 408) {
                        throw('Request Timeout');
                      }
                    else if (response.status === 400){
                          throw ('Bad request');
                    }
                     else {
                        if (json.errors) {
                            throw(json.errors);
                        } else {
                            throw('unknown error');
                        }
                    }
                })
        })
        .catch(error => {
            if (typeof error.message !== 'undefined') {
                throw(error.message);
            } else if (typeof error === 'string') {
                throw(error);
            } else if (Object.keys(error)) {
                let errStr = '';
                let errors = _.omit(error, ['column', 'line', 'sourceURL'])

                _.forEach(errors, function (value) {
                    errStr += value + '.\n';
                });
                throw (errStr);
            } else {
                throw('unknown error');
            }
        });
}

module.exports = { fetchAPI };

CONSOLE OUTPUT

У меня есть другой метод, который делает то же самое, что и этот (только с другой конечной точкой, но все остальное - копирование и вставка), который использует ту же функцию извлечения, описанную выше, и проблема никогда не возникала.

Но, как вы можете видеть из печатного журнала консоли (последняя строка), по какой-то причине этот бит всегда разрешается в catch вместо then, называя его reference error, как если бы запрос не был успешным.

Кто-нибудь знает, что здесь происходит?

1 Ответ

0 голосов
/ 09 мая 2018

Как я уже упоминал в своем комментарии к @riwu, моя ошибка была простой:

Я поспешно отредактировал свой код, где переместил action object из передаваемого в dispatch в качестве параметра в функцию receiveDetails() в качестве возвращаемого объекта. Затем я передал эту функцию примерно так dispatch(receiveDetails()).

Однако я забыл передать правильные параметры receiveDetails(), вызов должен был быть receiveDetails(request,json.data) вместо того, что я написал в моем посте выше.

Затем, когда этот receiveDetails() не может построить action object, он переходит к catch, где был запущен мой консольный журнал, и именно поэтому я предполагал, что он будет catch прямо из fetchAPI.

Такая глупая ошибка, извините, что ввела в заблуждение всех в этом посте, и спасибо за проницательные комментарии! : D

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