Javascript 存在捕获时可能未处理的承诺拒绝
我有以下代码:Javascript 存在捕获时可能未处理的承诺拒绝,javascript,react-native,redux,promise,Javascript,React Native,Redux,Promise,我有以下代码: export function fetchValueFromApi(){ return function act(dispatch){ dispatch(fetchingLimit); return fetch('https://someapi/v1/foo/bar?api_key=123456789') .then(response =>{ console.log("response"
export function fetchValueFromApi(){
return function act(dispatch){
dispatch(fetchingLimit);
return fetch('https://someapi/v1/foo/bar?api_key=123456789')
.then(response =>{
console.log("response",response.json());
response.json();
}).then(json =>{
if (json.data()) {
dispatch(receivingValue(json.data.result))
} else {
throw new Error('Error');
}
}).catch(error => dispatch(receivingValueFailed(error)))
}
}
现在我知道这个电话不会成功。我希望它会失败,陷入困境。但是,我遇到了以下错误:
可能未处理的承诺拒绝
因此,出于某种原因,我们没有达到.catch
我怎样才能解决这个问题呢?那么你是在抓住机会,而不是你预期的错误 就获取而言,403不是一个错误,因为请求本身已成功发出(响应不是应用程序所期望的)。您必须自己处理40倍的错误。正如您的console.log所显示的,异常发生在到达
抛出新错误之前
当发生网络错误时,fetch()承诺将以TypeError拒绝
在服务器端遇到或CORS配置错误,尽管
通常指许可问题或类似问题-404不构成
例如,网络错误
从
你应该
首先返回response.json()
,然后返回处理程序:。然后返回(response=>response.ok&&response.json())
在第二个中添加一个更安全的检查,然后像if(json&&json.data)
如果没有json数据,则分派失败操作,而不是抛出错误
所以你是在抓住机会,只是没有你预期的错误
就获取而言,403不是一个错误,因为请求本身已成功发出(响应不是应用程序所期望的)。您必须自己处理40倍的错误。正如您的console.log所显示的,异常发生在到达抛出新错误之前
当发生网络错误时,fetch()承诺将以TypeError拒绝
在服务器端遇到或CORS配置错误,尽管
通常指许可问题或类似问题-404不构成
例如,网络错误
从
你应该
首先返回response.json()
,然后返回处理程序:。然后返回(response=>response.ok&&response.json())
在第二个中添加一个更安全的检查,然后像if(json&&json.data)
如果没有json数据,则分派失败操作,而不是抛出错误
您没有返回
来自然后
处理程序的承诺,因此没有链接。响应机构甚至没有等待。catch
处理程序没有链接到实际拒绝的承诺,因此它确实没有处理错误
export function fetchValueFromApi(){
return function act(dispatch){
dispatch(fetchingLimit);
return fetch('https://someapi/v1/foo/bar?api_key=123456789')
.then(response => {
var body = response.json();
console.log("response body", body);
return body;
// ^^^^^^
}).then(json => {
if (json.data ) {
// ^
return dispatch(receivingValue(json.data.result))
// ^^^^^^
} else {
throw new Error('Error');
}
}).catch(error =>
dispatch(receivingValueFailed(error))
)
}
}
请记住,当您使用简明的正文语法时,箭头函数仅隐式返回表达式值,即不带大括号。您没有返回然后处理程序的承诺,因此没有链接。响应机构甚至没有等待。catch
处理程序没有链接到实际拒绝的承诺,因此它确实没有处理错误
export function fetchValueFromApi(){
return function act(dispatch){
dispatch(fetchingLimit);
return fetch('https://someapi/v1/foo/bar?api_key=123456789')
.then(response => {
var body = response.json();
console.log("response body", body);
return body;
// ^^^^^^
}).then(json => {
if (json.data ) {
// ^
return dispatch(receivingValue(json.data.result))
// ^^^^^^
} else {
throw new Error('Error');
}
}).catch(error =>
dispatch(receivingValueFailed(error))
)
}
}
请记住,当您使用简明的主体语法时,箭头函数仅隐式返回表达式值,即不带大括号。Mh可能是您的catch处理程序也抛出了错误吗?当我将此添加到catchconsole.log('Catching the error',error')代码>它打印:类型错误:无法读取未定义的属性“数据”
。但实际上我知道端点抛出了一个403Oh,我认为无论http状态如何,fetch都会返回成功。顺便说一句,您在response.json()之前缺少了一个返回。可能是您的catch处理程序也抛出了一个错误吗?当我将其添加到catchconsole.log('Catching the error',error')代码>它打印:类型错误:无法读取未定义的属性“数据”
。但事实上,我知道端点抛出了一个403Oh,我认为无论http状态如何,fetch都将返回成功。顺便说一句,您在response.json()之前缺少一个返回