Làm thế nào để viết TypeScript với axios bất đồng bộ? Và làm thế nào để sử dụng try/catch
Tôi đang cố gắng tìm hiểu cách tốt nhất để viết các yêu cầu axios bất đồng bộ trong TypeScript là gì. Liệu mỗi hàm có nên có khối try/catch riêng không? Nếu có, tôi nên định kiểu kết quả của hàm như thế nào?
Với khối try/catch, kiểu là: Promise<ExpectedType | undefined> Không có khối try/catch, kiểu là Promise<ExpectedType>
Đây là ví dụ:
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}`)
}
}
}
Bây giờ, khi tôi cần sử dụng v1/v1Copy trong một phần khác của mã của mình, tôi phải bao nó bên trong một khối try catch/catch. Điều này là hiển nhiên.
Cách tốt nhất để làm việc này là gì?
...
try {
const v1Result = await v1()
const v1CopyResult = await v1Copy()
// use v1Result and v1CopyResult
} catch(e) {}
đối đầu
...
const v2Result = await v2()
if (typeof v2Result !== 'undefined') {
// here should be a typeguard, right?
// use v2Result
}
Có được sử dụng v1 và v1Copy trong cùng một khối try/catch không? Cảm ơn... Tôi đang cố gắng tìm cách tốt nhất để xử lý điều này và hiểu lý do tại sao.
Câu trả lời #1
Tôi nghĩ cách tốt nhất là bao mỗi hàm trong một khối try/catch riêng của nó để toàn bộ mã không bị sập nếu một promise bị từ chối.