Techniques for Consistent Asynchronous Code Structure
Learn how to structure asynchronous code to maintain clarity and consistency, preventing callback hell.
0 likes
3 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" ] } ] }