等待 - 捕获错误 - UnhandledPromiseRejectionWarning

Posted

技术标签:

【中文标题】等待 - 捕获错误 - UnhandledPromiseRejectionWarning【英文标题】:await - catch error - UnhandledPromiseRejectionWarning 【发布时间】:2018-04-01 15:11:36 【问题描述】:

我明白了

 UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 44): Error: fail

main.js

import  request  from './api'

async getData( commit, state ,  ids )
  try 
    var x = await request(ids)
    commit('getData', x.data)
   catch ( e ) 
    console.log('request failed get',e.code,e.errno)
  

api.js

export async function request(type,url,ids)
  axios.get('localhost/data')
    .then(function (response) 
      return Promise.resolve(response.data)
    )
   .catch(function (e) 
     return Promise.reject(new Error('fail'))
  )

如何处理承诺拒绝? try catch 块不应该在这里从 await 函数中捕获错误吗?

【问题讨论】:

【参考方案1】:

您将 async/await 与 Promise 混为一谈。在api.js 中,不需要使用 async 关键字。 async 关键字使得你从函数返回的任何东西都被包装在一个你不需要的 Promise 中,因为 axios.get 已经返回了一个 Promise。

另外,你忘了实际从 Axios 返回承诺,你的 request 函数只是返回 undefined

最后,您不必从 thencatch 方法返回 Promise,只需返回一个值或抛出错误。

如果你像这样重写函数,它应该可以按预期工作:

export function request(type,url,ids)
  return axios.get('localhost/data')
    .then(function (response) 
      return response.data
    )
    .catch(function (e) 
      throw new Error('fail')
    )

【讨论】:

谢谢,我刚刚注意到我忘记了返回函数 - 好的,我想我明白了,我在一个有点没用的承诺中返回一个承诺

以上是关于等待 - 捕获错误 - UnhandledPromiseRejectionWarning的主要内容,如果未能解决你的问题,请参考以下文章

异步 - 等待 JavaScript:无法从错误对象中捕获错误详细信息 [重复]

快速错误处理和异步等待

将 Node.js 流错误事件传播到异步等待样式代码

捕获回调函数引发的错误

处理 Mongoose 异步/等待调用中的错误

try..catch 没有捕捉到异步/等待错误