javascript - 来自 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
就好像请求不成功一样。
有人知道这里发生了什么吗?
解决方案
正如我在对@riwu 的评论回复中提到的,我的错误很简单:
我匆忙编辑了我的代码,在那里我将作为参数action object
传递给函数的函数作为返回对象。然后我像这样传递了那个函数。dispatch
receiveDetails()
dispatch(receiveDetails())
但是,我忘记将正确的参数传递给receiveDetails()
,调用应该是receiveDetails(request,json.data)
而不是我在上面的帖子中写的。
然后,当receiveDetails()
无法构建.action object
catch
catch
fetchAPI
如此愚蠢的错误,很抱歉在这篇文章中误导了大家,并感谢您富有洞察力的评论!:D
推荐阅读
- html - 修复 rtl bootstrap 导航栏目录
- javascript - Node.js 和 Zaproxy UnhandledPromiseRejectionWarning: RequestError: Error: socket hang up
- php - 正则表达式数字,如 1.1k
- .net-core - dotnet 信息输出中的“反映任何 global.json”消息是什么意思?
- unpoly - 条件单模态对话框关闭
- r - 查找范围 R 的索引
- yii - 如何确定 Yii 应用程序执行的结束位置?
- c# - 合并两个数组时,第一个数组变短 1
- search - 合并包含相同 ID 的多个文件 - Linux
- azure - Azure 数据工厂未加载