首页 > 解决方案 > 来自 fetch 的承诺没有正确解决

问题描述

所以我有这个方法,我用它来调用我在单独的 js 文件中定义的通用 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 };

控制台输出

我有另一种方法与此完全相同(只是端点不同,但其他一切都是复制和粘贴),它使用上面相同的 fetch 函数,问题从未出现。

但是正如您从打印的控制台日志(最后一行)中看到的那样,由于某种原因,该位总是解析为catch而不是then,将其称为 areference error就好像请求不成功一样。

有人知道这里发生了什么吗?

标签: javascriptreactjsreact-nativepromisefetch

解决方案


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

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

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

然后,当receiveDetails()无法构建.action objectcatchcatchfetchAPI

如此愚蠢的错误,很抱歉在这篇文章中误导了大家,并感谢您富有洞察力的评论!:D


推荐阅读