实用异步 JavaScript

2025-06-08

实用异步 JavaScript

介绍

让我们花点时间一起复习一下一些 JavaScript 异步概念。

什么是异步?

首先,我们来回顾一下什么是异步进程。简单来说,异步进程并非立即执行,而是存在延迟或滞后。这就像在一家人很多的咖啡馆点咖啡——你下了单,需要等待一段时间才能拿到杯子。

创建虚假 API 调用

好吧,我们可以创建一个模拟基本 API 调用的函数吗?
当然可以!这里有一个简单的例子:

function fakeApiCall(response) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`Success: ${response}`);
    }, 1000);
  });
}
Enter fullscreen mode Exit fullscreen mode

我们的 fakeApiCall 函数接受一个值,并在 1 秒延迟后返回,并标记为“成功”。我们使用 Promise 是因为它始终处理异步代码,并使用 setTimeout 来管理延迟。

添加错误处理

但是,API 调用总是会返回预期值吗?不,有时它们会返回错误。让我们也添加这个功能:

function fakeApiCall(response) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (Math.random() > 0.5) {
        resolve(`Success: ${response}`);
      } else {
        reject('API call failed: try again');
      }
    }, 1000);
  });
}
Enter fullscreen mode Exit fullscreen mode

这里,我们使用 Math.random() 添加了一个条件。现在,成功的概率为 50%,失败的概率也为 50%,模拟了真实世界中 API 的行为。

失败时重试

太棒了!但是,如果我们想在 API 调用失败时重试,该怎么办呢?让我们来解决这个问题:

let attempt = 0;
async function makeApiCallWithRetries(value) {
  try {
    const result = await fakeApiCall(value);
    return result;
  } catch (error) {
    attempt++;
    console.log(`Attempt ${attempt} failed: ${error} - for value: ${value}`);
    return makeApiCallWithRetries(value);
  }
}
Enter fullscreen mode Exit fullscreen mode

在这段代码中,我们会不断重试,直到收到成功响应。
注意,如果运气不好,这可能会导致无限循环,但我们希望一切顺利!

设置重试限制

为了避免无限循环,让我们设置最大重试限制:

let attempt = 0;
const maxRetries = 5;

async function makeApiCallWithRetries(value) {
  try {
    const result = await fakeApiCall(value);
    return result;
  } catch (error) {
    attempt++;
    if (attempt >= maxRetries) {
      throw new Error(`Max retries reached: ${error}`);
    }
    console.log(`Attempt ${attempt} failed: ${error} - for value: ${value}`);
    return makeApiCallWithRetries(value);
  }
}
Enter fullscreen mode Exit fullscreen mode

现在,我们将在尝试五次后停止尝试,避免可怕的无限循环。

进行并行 API 调用

那么,如果我们需要同时进行多个 API 调用怎么办?
让我们仔细想想。假设我们有一堆请求需要一次性发出。该如何高效地处理呢?
我们可以并行运行它们。方法如下:

async function makeApiCallsInParallel(values) {
  const promises = values.map((value) => makeApiCallWithRetries(value));

  const results = await Promise.allSettled(promises);

  results.forEach((result, index) => {
    if (result.status === 'fulfilled') {
      console.log(`Response ${index + 1} succeeded: ${result.value}`);
    } else {
      console.log(`Response ${index + 1} failed: ${result.reason}`);
    }
  });
}
Enter fullscreen mode Exit fullscreen mode

此函数接受一个值数组,并为每个值并行调用 makeApiCallWithRetries 。我们使用 Promise.allSettled 来处理成功和失败的调用。

结论

我希望这能刷新您对核心 JavaScript 异步功能的记忆,甚至教会您一些新东西。

感谢关注!点击订阅获取更多!👋

鏂囩珷鏉ユ簮锛�https://dev.to/bgdnvarlamov/practical-async-javascript-ep5
PREV
成为机器学习者所需的一切
NEXT
如何使用 HTML、CSS 或 JavaScript 在您的网站中添加表情符号