第31天:异步等待
#javascript #100daysofcode #day31

在Ecmascript 2017中引入asyncawait(ES8)彻底改变了开发人员如何处理异步任务,使代码更可读和可维护。在asyncawait之前,开发人员依靠回调并承诺管理异步操作。回调导致臭名昭著的“回调地狱”,而承诺可以提高代码可读性。但是,承诺仍然需要处理.then().catch()链,这在更复杂的情况下可能会变得复杂。

ð输入异步/等待

asyncawait建立在承诺之上,并提供了一种更优雅,更直观的方式来使用异步代码。 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));

异步/等待的好处

  1. 可读性:异步代码几乎像同步代码一样读取,使开发人员更容易理解执行流程。

  2. 错误处理:带有试用块块,错误处理变得更加自然和局部化,改善了调试。

  3. 顺序代码: await允许您在处理异步任务时可以编写顺序代码,从而增强程序的逻辑结构。

  4. 保证链接减少: async/await消除了.then().catch()呼叫的长链,导致了更清洁的代码。

  5. 并发异步呼叫:您可以将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));

潜在的陷阱和最佳实践

  1. 并不总是必要的:并非每个功能都需要是async。仅当您需要暂停该函数的执行才能等待解决方案时使用它。

  2. 避免阻塞:尽管await可以阻止该功能,但它不会阻止整个线程,从而确保仍然可以执行其他任务。

  3. 毫无手持的承诺拒绝:确保使用try-catch.catch()进行适当的错误处理,以防止无人驾驶的承诺拒绝。

  4. 顺序与平行:要注意是否应顺序执行或并行执行任务,并相应地构造您的代码。