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处理程序也抛出了错误吗?当我将此添加到catch
    console.log('Catching the error',error')它打印:
    类型错误:无法读取未定义的属性“数据”
    。但实际上我知道端点抛出了一个403Oh,我认为无论http状态如何,fetch都会返回成功。顺便说一句,您在
    response.json()之前缺少了一个返回。可能是您的catch处理程序也抛出了一个错误吗?当我将其添加到catch
    console.log('Catching the error',error')它打印:
    类型错误:无法读取未定义的属性“数据”
    。但事实上,我知道端点抛出了一个403Oh,我认为无论http状态如何,fetch都将返回成功。顺便说一句,您在
    response.json()之前缺少一个返回