我正在尝试找出写typescript async axios请求的最好方法。如果每个函数都应该有自己的try/catch块吗?如果是,我应该如何输入函数的结果?
对于try/catch块,其类型为:Promise<ExpectedType | undefined>
如果没有try/catch块,则类型为Promise<ExpectedType>
下面是一个示例:
async function v1(): Promise<ExpectedType> {
const response = await axios.get('https://...')
return response.data
}
async function v1Copy(): Promise<ExpectedType> {
const response = await axios.get('https://...')
return response.data
}
async function v2(): Promise<ExpectedType | undefined> {
try {
// I could use object destructuring for 'data' but ignore this for now
const response = await axios.get('https://...')
return response.data
} catch (e) {
// how to handle this safely
const error = e as AxiosError | Error
if (error instanceof AxiosError) {
if (error.response) {
console.error(`axios error: ${error.response.status} ${error.response.statusText}`)
} else {
console.error(`axios error: ${error.message}`)
}
} else {
console.error(`generic error: ${error.message}`)
}
}
}
现在,当我需要在代码的另一部分使用v1 / v1Copy
时,我必须将它 Package 在try catch/catch块中。这是显而易见的。
最好的方法是什么?
...
try {
const v1Result = await v1()
const v1CopyResult = await v1Copy()
// use v1Result and v1CopyResult
} catch(e) {}
与
...
const v2Result = await v2()
if (typeof v2Result !== 'undefined') {
// here should be a typeguard, right?
// use v2Result
}
可以在同一个try/catch块中使用v1
和v1Copy
吗?谢谢...我正在尝试找到处理这个问题的最佳方法,并了解原因。
1条答案
按热度按时间webghufk1#
我认为最好的方法是将每个函数 Package 在它自己的try/catch块中,这样如果一个承诺被拒绝,整个代码就不会崩溃。