当前位置:首页 > JavaScript

js async实现

2026-04-05 21:51:23JavaScript

Async/Await 实现原理

Async/await 是 JavaScript 中处理异步操作的语法糖,底层基于 Promise 和 Generator 实现。其核心是将异步代码写成同步形式,但实际执行仍是非阻塞的。

async function fetchData() {
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();
  return data;
}

Promise 基础实现

Async/await 本质是 Promise 的封装。以下代码展示如何用 Promise 实现类似功能:

function fetchData() {
  return fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => data);
}

Generator 模拟 Async

通过 Generator 可以手动实现类似 async/await 的控制流:

function runGenerator(generatorFunc) {
  const generator = generatorFunc();

  function handle(result) {
    if (result.done) return Promise.resolve(result.value);
    return Promise.resolve(result.value)
      .then(res => handle(generator.next(res)))
      .catch(err => handle(generator.throw(err)));
  }

  return handle(generator.next());
}

function* fetchData() {
  const response = yield fetch('https://api.example.com/data');
  const data = yield response.json();
  return data;
}

runGenerator(fetchData);

错误处理机制

Async/await 的错误处理可以通过 try/catch 实现:

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    return await response.json();
  } catch (error) {
    console.error('Fetch failed:', error);
    throw error;
  }
}

并行执行优化

多个独立异步操作可用 Promise.all 并行执行:

async function fetchMultiple() {
  const [user, posts] = await Promise.all([
    fetch('/user'),
    fetch('/posts')
  ]);
  return {
    user: await user.json(),
    posts: await posts.json()
  };
}

底层转换示例

Babel 等工具会将 async/await 转换为 ES5 兼容代码。以下是简化后的转换逻辑:

js async实现

function _asyncToGenerator(fn) {
  return function() {
    const self = this;
    const args = arguments;
    return new Promise((resolve, reject) => {
      const gen = fn.apply(self, args);

      function step(key, arg) {
        let info, value;
        try {
          info = gen[key](arg);
          value = info.value;
        } catch (error) {
          reject(error);
          return;
        }
        if (info.done) {
          resolve(value);
        } else {
          Promise.resolve(value).then(
            v => step("next", v),
            e => step("throw", e)
          );
        }
      }

      step("next");
    });
  };
}

标签: jsasync
分享给朋友:

相关文章

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 c…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…

js实现导航菜单

js实现导航菜单

使用HTML和CSS创建基础结构 导航菜单的基础结构通常由HTML的无序列表(<ul>)和列表项(<li>)组成,每个列表项包含一个链接(<a>)。CSS用于样式化…

vue js实现登录

vue js实现登录

Vue.js 登录功能实现 依赖安装 确保项目已安装 Vue.js 和必要的依赖库(如 Vue Router、Axios)。通过以下命令安装: npm install vue-router axio…