在Ecmascript 2017中引入async
和await
(ES8)彻底改变了开发人员如何处理异步任务,使代码更可读和可维护。在async
和await
之前,开发人员依靠回调并承诺管理异步操作。回调导致臭名昭著的“回调地狱”,而承诺可以提高代码可读性。但是,承诺仍然需要处理.then()
和.catch()
链,这在更复杂的情况下可能会变得复杂。
ð输入异步/等待
async
和await
建立在承诺之上,并提供了一种更优雅,更直观的方式来使用异步代码。 async
用于声明异步函数,在该功能中,您可以使用await
暂停执行,直到解决承诺为止。
async function fetchData(url) {
try {
const response = await fetch(url);
const data = await response.json();
return data;
} catch (error) {
console.error("Error fetching data:", error);
throw error;
}
}
// Usage
fetchData("https://api.example.com/data")
.then(result => console.log(result))
.catch(error => console.error(error));
异步/等待的好处
-
可读性:异步代码几乎像同步代码一样读取,使开发人员更容易理解执行流程。
-
错误处理:带有试用块块,错误处理变得更加自然和局部化,改善了调试。
-
顺序代码:
await
允许您在处理异步任务时可以编写顺序代码,从而增强程序的逻辑结构。 -
保证链接减少:
async/await
消除了.then()
和.catch()
呼叫的长链,导致了更清洁的代码。 -
并发异步呼叫:您可以将
Promise.all()
与await
一起执行多个异步操作。
async function fetchMultipleData(urls) {
const promises = urls.map(url => fetchData(url));
const results = await Promise.all(promises);
return results;
}
// Usage
fetchMultipleData([
"https://api.example.com/data/1",
"https://api.example.com/data/2"
]).then(results => console.log(results));
潜在的陷阱和最佳实践
-
并不总是必要的:并非每个功能都需要是
async
。仅当您需要暂停该函数的执行才能等待解决方案时使用它。 -
避免阻塞:尽管
await
可以阻止该功能,但它不会阻止整个线程,从而确保仍然可以执行其他任务。 -
毫无手持的承诺拒绝:确保使用
try-catch
或.catch()
进行适当的错误处理,以防止无人驾驶的承诺拒绝。 -
顺序与平行:要注意是否应顺序执行或并行执行任务,并相应地构造您的代码。