【问题标题】:How to use try/catch, promise catch and async function correctly?如何正确使用 try/catch、promise catch 和 async 函数?
【发布时间】:2018-10-10 18:52:11
【问题描述】:

这就是我的上传功能目前的样子。我正在使用阿波罗突变来上传文件。

我不明白如何正确使用 try/catch 和 catch of the promise(client.mutate() 是)。 另外我将上传函数声明为async

所以我想我把一些事情搞混了:-(

如何正确捕捉错误?

我需要两个鱼钩吗?如果我使用异步函数,我不应该替换 try/catch 吗?

export default async function upload (client) {
  try {
    return client.mutate({
      mutation: uploadsMutation
    }).catch(err => {
      console.error(err)
    })
  } catch (error) {
    Alert.alert('Error', 'Could not upload files')
  }
}

【问题讨论】:

标签: javascript async-await try-catch ecmascript-2017


【解决方案1】:

asyncawait 必须同时使用 - 这意味着如果不使用 await 关键字,不会自动“等待”任何内容。在您的示例中,您只是返回从 client.mutate 返回的 Promise。

export default async function upload (client) {
  try {
    return await client.mutate({
      mutation: uploadsMutation
    });
  } catch (error) {
    Alert.alert('Error', 'Could not upload files')
  }
}

请记住,您的 upload 函数也会通​​过 async 返回一个 Promise。所以调用代码应该适当地处理它。

【讨论】:

  • FWIW 你不必在async 函数中使用await。直接返回 Promise 就可以了,但当然 try...catch 不起作用,并且创建函数 async 没有意义,但这样做是“可以的”。
  • 你说得对,我通常创建async 函数只是为了表示它们返回一个承诺,可能会进一步生成。编辑了答案以澄清这一点。
  • 我理解正确吗,我应该直接返回promise并在调用上传函数的地方运行try/catch?
  • 可以如果这看起来适合你的使用。您的示例直接在 upload 函数中处理它。如果你这样做,调用代码将需要await upload(client);
猜你喜欢
  • 2017-11-23
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
相关资源
最近更新 更多