当前位置:首页 > 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 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…