Techniques for Consistent Asynchronous Code Structure
Learn how to structure asynchronous code to maintain clarity and consistency, preventing callback hell.
0 likes
168 views
Rule Content
{
"title": "Techniques for Consistent Asynchronous Code Structure",
"description": "Learn how to structure asynchronous code to maintain clarity and consistency, preventing callback hell.",
"category": "JavaScript Cursor Rules",
"rules": [
{
"name": "Prefer Async/Await Over Callbacks",
"description": "Use async/await syntax instead of callbacks to improve readability and maintainability of asynchronous code.",
"examples": {
"bad": "function fetchData(callback) {\n fetch('https://api.example.com/data')\n .then(response => response.json())\n .then(data => callback(null, data))\n .catch(error => callback(error));\n}",
"good": "async function fetchData() {\n try {\n const response = await fetch('https://api.example.com/data');\n const data = await response.json();\n return data;\n } catch (error) {\n throw error;\n }\n}"
},
"references": [
"https://blog.jetbrains.com/webstorm/2024/10/javascript-best-practices-2024/"
]
},
{
"name": "Avoid Nesting Asynchronous Calls",
"description": "Flatten nested asynchronous calls to prevent callback hell and enhance code clarity.",
"examples": {
"bad": "fs.readFile('file1.txt', (err, data1) => {\n if (err) throw err;\n fs.readFile('file2.txt', (err, data2) => {\n if (err) throw err;\n fs.readFile('file3.txt', (err, data3) => {\n if (err) throw err;\n console.log(data1, data2, data3);\n });\n });\n});",
"good": "async function readFiles() {\n try {\n const data1 = await fs.promises.readFile('file1.txt');\n const data2 = await fs.promises.readFile('file2.txt');\n const data3 = await fs.promises.readFile('file3.txt');\n console.log(data1, data2, data3);\n } catch (err) {\n console.error(err);\n }\n}\nreadFiles();"
},
"references": [
"https://medium.com/@terfabinda/common-pitfalls-and-best-practices-in-managing-asynchronous-code-in-javascript-89d0bac37955"
]
},
{
"name": "Use Promise.all for Concurrent Operations",
"description": "Utilize Promise.all to run multiple independent asynchronous operations concurrently for better performance.",
"examples": {
"bad": "async function fetchAllData() {\n const data1 = await fetchData1();\n const data2 = await fetchData2();\n console.log(data1, data2);\n}",
"good": "async function fetchAllData() {\n try {\n const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);\n console.log(data1, data2);\n } catch (error) {\n console.error('Error fetching data:', error);\n }\n}\nfetchAllData();"
},
"references": [
"https://medium.com/@terfabinda/common-pitfalls-and-best-practices-in-managing-asynchronous-code-in-javascript-89d0bac37955"
]
},
{
"name": "Handle Errors with Try/Catch in Async Functions",
"description": "Implement try/catch blocks within async functions to handle errors gracefully and maintain application stability.",
"examples": {
"bad": "async function fetchData() {\n const response = await fetch('https://api.example.com/data');\n const data = await response.json();\n return data;\n}",
"good": "async function fetchData() {\n try {\n const response = await fetch('https://api.example.com/data');\n const data = await response.json();\n return data;\n } catch (error) {\n console.error('Fetch error:', error);\n throw error;\n }\n}"
},
"references": [
"https://codelucky.com/javascript-best-practices/"
]
},
{
"name": "Avoid Await Inside Loops",
"description": "Refrain from using await inside loops; instead, collect promises and use Promise.all to execute them concurrently.",
"examples": {
"bad": "for (const url of urls) {\n const response = await fetch(url);\n const data = await response.json();\n console.log(data);\n}",
"good": "const fetchPromises = urls.map(url => fetch(url).then(response => response.json()));\nconst data = await Promise.all(fetchPromises);\ndata.forEach(item => console.log(item));"
},
"references": [
"https://dev.to/safdarali/several-recommended-practices-for-writing-good-asynchronous-javascript-code-1oc1"
]
}
]
}