首页 文章

在获取期间捕获UnhandledPromiseRejectionWarning

提问于
浏览
1

我有一个代码:

function () {
  return new Promise((resolve, reject) => {
    try {
      fetch(URL, { method: METHOD, body: BODY })
        .then((res) => res.json())
        .then((json) => {
          resolve(json);
        })
        .catch((res) => {
          reject(res);
        })
    } catch (exception) {
      reject(exception);
    }
  });
}

当服务器响应不是json我得到了

UnhandledPromiseRejectionWarning:未处理的承诺拒绝 . 此错误源于通过抛出异步函数而没有catch块,或者拒绝未使用.catch()处理的promise .

我知道try-catch不会捕获异步抛出 .

我读过了

Cannot catch UnhandledPromiseRejectionWarning in promise

Try Catch unable to catch UnhandledPromiseRejectionWarning

“UnhandledPromiseRejectionWarning” error even when catch is present

但我的问题没有答案 .

1 回答

  • 2

    Try catch 将无法处理异步抛出的错误(即,在promise中),您必须使用 .catch() .

    JSfiddle

    function someFunc() {
        return new Promise((resolve, reject) => {
    
            fetch(URL, {method: METHOD, body: BODY})
                .then((res) => res.json())
                .then((json) => {
                    resolve(json);
                })
                .catch((err) => {
                    reject(err);
                })
        });
    }
    
    someFunc()
    .then((value)=>{})
    .catch((err)=>{console.log(err)})
    

    编辑:当服务器响应没有 json 但有错误时,您返回的承诺是 rejected . 因此,您应该确保在函数调用中调用 .catch() (即 someFunc().catch(()=>{}) ) . 如果未经处理的拒绝承诺(没有捕获),则会出现此错误 .

    Edit2:哎呀 . 对不起,误读了你的问题,但我想解释仍然相同 . 如果 res 没有 json() 方法,则在调用 res.json() 时会抛出以下错误::

    Uncaught TypeError: res.json() is not a function
    

    error 将被 .catch() 块捕获 . Now catch block will return a new rejected promise. 当调用该函数并且没有 catch() 来处理请求时,将抛出您正在讨论的错误 .

    我已经解释了更多here .

相关问题