掌握异步 JavaScript:回调、Promises 和 Async/Await
理解 JavaScript 异步编程
JavaScript 中的异步编程对于处理耗时任务(例如从 API 获取数据、读取文件或与数据库交互)至关重要。它确保 JavaScript 即使在执行耗时操作时也能保持非阻塞和响应。
同步与异步编程
console.log("Task 1"); console.log("Task 2"); console.log("Task 3");
输出:
Task 1 Task 2 Task 3
console.log("Task 1"); setTimeout(() => console.log("Task 2"), 1000); console.log("Task 3");
输出:
Task 1 Task 3 Task 2
JavaScript 异步中的关键概念
function fetchData(callback) { setTimeout(() => { console.log("Data fetched"); callback(); }, 1000); } fetchData(() => console.log("Callback executed"));
**例子**:
const promise = new Promise((resolve, reject) => { let success = true; if (success) resolve("Operation successful"); else reject("Operation failed"); }); promise .then(result => console.log(result)) .catch(error => console.error(error));
async function fetchData() { try { const response = await fetch("https://api.example.com/data"); const data = await response.json(); console.log(data); } catch (error) { console.error("Error fetching data:", error); } } fetchData();
常见异步操作
setTimeout(() => console.log("Executed after 1 second"), 1000); setInterval(() => console.log("Repeats every second"), 1000);
fetch("https://api.example.com/data") .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error("Error:", error));
document.querySelector("button").addEventListener("click", () => { console.log("Button clicked"); });
异步代码中的错误处理
fetch("https://api.example.com/data") .then(response => response.json()) .catch(error => console.error("Error:", error));
async function fetchData() { try { const data = await fetch("https://api.example.com/data"); console.log(data); } catch (error) { console.error("Error fetching data:", error); } }
异步 JavaScript 的最佳实践
asyncTask1(() => { asyncTask2(() => { asyncTask3(() => { console.log("Tasks complete"); }); }); });
承诺解决方案:
asyncTask1() .then(() => asyncTask2()) .then(() => asyncTask3()) .then(() => console.log("Tasks complete")) .catch(error => console.error(error));
const promise1 = fetch("https://api.example.com/data1"); const promise2 = fetch("https://api.example.com/data2"); Promise.all([promise1, promise2]) .then(responses => Promise.all(responses.map(res => res.json()))) .then(data => console.log(data)) .catch(error => console.error(error));
结论
了解异步编程对于构建高效且响应迅速的 JavaScript 应用程序至关重要。通过掌握回调、承诺和异步/等待,您可以编写更干净、更易于维护的异步代码,有效地处理错误,并优化实际应用程序的性能。掌握 JavaScript 异步是现代 Web 开发的关键。