विचार करें कि मैं redux async क्रिया का उपयोग करके एक बहुत ही सामान्य एपीआई कॉल कर रहा हूँ। परिणाम के संबंध में एक "INIT"
प्रेषण और या तो "SUCCESS"
या "FAILURE"
है।
क्या "INIT"
प्रेषण को try catch
ब्लॉक में डालने से कोई फर्क पड़ता है?
विकल्प A (try catch
ब्लॉक के बाहर):
export const doSomething = data => async dispatch => {
dispatch(doSomethingInit()) // <-- outside try block
try {
let response = await client.get("/api")
if (response) {
dispatch(doSomethingSuccess(response.data))
}
} catch (error) {
dispatch(doSomethingFailure(error))
}
}
विकल्प बी (try catch
ब्लॉक के अंदर):
export const doSomething = data => async dispatch => {
try {
dispatch(doSomethingInit()) // <-- inside the try block
let response = await client.get("/api")
if (response) {
dispatch(doSomethingSuccess(response.data))
}
} catch (error) {
dispatch(doSomethingFailure(error))
}
}
मैं कहूंगा कि यह सिर्फ एक सूक्ष्म अनिवार्य विवरण है, हालांकि मैं इसके बारे में सोचने में एक मिनट खर्च करता हूं, लगभग हर बार जब मैं एक नई एसिंक क्रिया लिखता हूं ...: /
1 उत्तर
मैं आमतौर पर यह सोचने से बचता हूं कि चीजें throw
नहीं होंगी।
क्या होगा अगर यह फेंकता है? कौन सा कोड इसे संभालने जा रहा है? आपके पास एक बाहरी try-catch
ब्लॉक हो सकता है, लेकिन अब doSomething
के दौरान जो कुछ हुआ, उसे कहीं और संभाला जा रहा है।
मुझे लगता है कि चूंकि आपका कार्य/थंक doSomething
के लिए "कोशिश" कर रहा है, इसलिए इसे अपने जीवन चक्र के दौरान होने वाली किसी भी चीज को कोशिश करने और पकड़ने के लिए जिम्मेदार होना चाहिए। भले ही, सिद्धांत रूप में, उस समय ऐसा नहीं होगा।
इसलिए मैं आमतौर पर विकल्प B के साथ जाता हूं।
export const doSomething = data => async dispatch => {
try {
dispatch(doSomethingInit()) // <-- inside the try block
let response = await client.get("/api")
if (response) {
dispatch(doSomethingSuccess(response.data))
}
} catch (error) {
console.error(error); // YOU MIGHT LOG IT HERE
dispatch(doSomethingFailure(error))
}
}
मुझे यह भी लगता है कि कोड try-catch
ब्लॉक के अंदर सब कुछ के साथ बेहतर पढ़ता है।