当前位置:首页 > JavaScript

js实现async

2026-04-05 17:30:30JavaScript

使用 Promise 实现 async/await

在 JavaScript 中,async/await 是建立在 Promise 之上的语法糖。可以通过 Promise 和生成器函数模拟 async/await 的行为。

function asyncGenerator(generatorFunc) {
  return function (...args) {
    const generator = generatorFunc(...args);
    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());
  };
}

示例用法

定义一个生成器函数并使用 asyncGenerator 包装:

js实现async

const fetchData = () => new Promise(resolve => setTimeout(() => resolve('Data fetched'), 1000));

const asyncFunc = asyncGenerator(function* () {
  try {
    const data = yield fetchData();
    console.log(data); // 输出: Data fetched
    return data;
  } catch (error) {
    console.error(error);
  }
});

asyncFunc();

手动实现 async/await 的核心逻辑

  1. 生成器函数:使用 function* 定义生成器函数,通过 yield 暂停执行。
  2. 递归处理:通过递归或循环处理生成器的每一步,将 Promise 的结果传递回生成器。
  3. 错误处理:捕获 Promise 的异常并通过 generator.throw 抛出。

完整实现

function asyncify(generatorFunc) {
  return function (...args) {
    const generator = generatorFunc(...args);

    const step = (nextValue, isError = false) => {
      const result = isError ? generator.throw(nextValue) : generator.next(nextValue);

      if (result.done) {
        return Promise.resolve(result.value);
      }

      return Promise.resolve(result.value)
        .then(value => step(value))
        .catch(error => step(error, true));
    };

    return step();
  };
}

使用场景

这种实现方式适用于需要在没有原生 async/await 支持的环境(如旧版浏览器或特定运行时)中模拟异步流程控制。现代 JavaScript 引擎已原生支持 async/await,推荐直接使用原生语法。

标签: jsasync
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现按钮点击

js实现按钮点击

实现按钮点击的JavaScript方法 HTML按钮元素 在HTML中创建按钮元素,为其添加id或class以便JavaScript选择: <button id="myButton">点…

js实现排序

js实现排序

数组排序方法 JavaScript提供了内置的sort()方法用于数组排序。默认情况下,sort()将元素转换为字符串并按照Unicode码点排序。对于数字排序,需传入比较函数。 const num…