承诺从获取不正确解决

时间:2018-05-08 05:09:51

标签: javascript reactjs react-native promise fetch

所以我使用这个方法调用我在单独的js文件中定义的all purpose fetch方法:

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 :(得分:0)

正如我在回复@riwu的评论中提到的,我的错误很简单:

我匆忙编辑了我的代码,我将action object作为参数传递给dispatch作为返回对象传递给receiveDetails()函数。 然后我像dispatch(receiveDetails())那样传递了这个函数。

但是,我忘记将正确的参数传递给receiveDetails(),这个电话应该是receiveDetails(request,json.data),而不是我在上面的帖子中写的。

然后,当receiveDetails()无法构建action object时,它会转到catch,我的控制台日志会被触发,这就是我假设的原因从catch直接fetchAPI

这是一个愚蠢的错误,很抱歉在这篇文章中误导了所有人并感谢有见地的评论! :d

相关问题