Promise+async+Generator的实现原理

yizhihongxing

下面是 Promise+async+Generator 的实现原理的完整攻略:

Promise 的实现

  1. Promise 内部维护了一个状态值,有三种状态:pending, fulfilledrejected

  2. 在 Promise 内部定义了 resolvereject 两种方法,用于设置异步操作成功和失败后的返回结果。

  3. Promise 内部还定义了 then 方法,用于注册事件回调,当异步操作成功时触发 onfulfilled,当异步操作失败时触发 onrejected

简单的 Promise 示例:

function myPromise(fn) {
  let state = 'pending';
  let value = null;
  const callbacks = [];

  this.then = function (onFulfilled, onRejected) {
    return new myPromise((resolve, reject) => {
      handle({ onFulfilled, onRejected, resolve, reject });
    });
  };

  function handle(callback) {
    if (state === 'pending') {
      callbacks.push(callback);
      return;
    }

    const cb =
      state === 'fulfilled' ? callback.onFulfilled : callback.onRejected;
    const next = state === 'fulfilled' ? callback.resolve : callback.reject;

    if (!cb) {
      next(value);
      return;
    }

    let ret;
    try {
      ret = cb(value);
    } catch (e) {
      callback.reject(e);
      return;
    }
    callback.resolve(ret);
  }

  function resolve(newValue) {
    if (newValue && typeof newValue.then === 'function') {
      newValue.then(resolve, reject);
      return;
    }
    state = 'fulfilled';
    value = newValue;
    setTimeout(() => {
      callbacks.forEach((callback) => handle(callback));
    }, 0);
  }

  function reject(error) {
    state = 'rejected';
    value = error;
    setTimeout(() => {
      callbacks.forEach((callback) => handle(callback));
    }, 0);
  }

  fn(resolve, reject);
}

// 调用示例
const p = new myPromise((resolve, reject) => {
  setTimeout(() => {
    resolve('hello');
  }, 2000);
});
p.then((result) => {
  console.log(result); // hello
});

Generator 的实现

  1. Generator 的核心就是用 yield 暂停和恢复函数的执行,并且通过 next() 方法来控制函数的执行流程。

  2. Generator 函数返回一个可迭代的 Generator 对象,该对象包含一个 next() 方法,在每次调用该方法时会返回一个包含两个属性的对象:valuedone

简单的 Generator 示例:

function* myGenerator() {
  yield 'hello';
  yield 'world';
  return 'end';
}

const gen = myGenerator();
console.log(gen.next().value); // hello
console.log(gen.next().value); // world
console.log(gen.next().value); // end

async 的实现

  1. async 就是 Generator 的语法糖,用于简化异步编程的复杂度。

  2. async 函数返回一个 Promise 对象,该对象在正常执行结束后会返回最终结果,如果出现错误则会抛出异常。

  3. async 函数中可以使用 await 关键字暂停函数执行,等待异步操作完成后继续执行,并且 await 后面的表达式必须返回 Promise 对象。

简单的 async 示例:

const fetch = require('node-fetch');

async function myAsync() {
  try {
    const res = await fetch('https://jsonplaceholder.typicode.com/users/1');
    const data = await res.json();
    console.log(data.name);
  } catch (e) {
    console.error(e);
  }
}

myAsync();

Promise + async + Generator 的实现

  1. async 函数内部可以使用 Generator 函数执行异步操作,Generator 函数每遇到一个 yield 都会暂停执行并返回一个 Promise 对象,可以使用 next() 方法继续执行 Generator 函数。

  2. async 函数中使用的 await 关键字就是对 Generator 函数的语法封装,使其不需要手动调用 next() 方法,等待异步操作完成后继续执行。

简单的 Promise+async+Generator 示例:

function delay(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

function* myGenerator() {
  yield delay(2000);
  yield delay(1000);
  return 'end';
}

async function myAsync() {
  const gen = myGenerator();
  console.log('start');
  await gen.next().value;
  console.log('2s later');
  await gen.next().value;
  console.log('1s later');
  console.log(await gen.next().value);
}

myAsync();

以上就是 Promise+async+Generator 的实现原理的完整攻略,希望对你有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Promise+async+Generator的实现原理 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript中发出HTTP请求最常用的方法

    当我们使用JavaScript编写网页应用时,经常需要与服务器进行数据交互。而在与服务器进行交互时,最常用的方法就是发出HTTP请求,以获取或者传输数据。 JavaScript中发出HTTP请求最常用的方法是使用XMLHttpRequest对象。XMLHttpRequest对象是浏览器提供的一种可以与服务器进行数据交互的接口。通过XMLHttpRequest…

    JavaScript 2023年5月27日
    00
  • 疯掉了,尽然有js写的操作系统

    关于“疯掉了,竟然有JS写的操作系统”,我可以提供以下攻略。 什么是“JS操作系统” “JS操作系统”实际上是基于浏览器的操作系统,使用前端技术进行开发,其核心思想是JavaScript虚拟机和Web浏览器的结合。在这种操作系统中,所有IED编写的HTML、CSS和JavaScript均可作为应用程序运行。 如何搭建“JS操作系统” 1. 安装Node.js…

    JavaScript 2023年5月27日
    00
  • 微信小程序引入Vant组件库过程解析

    下面是详细讲解如何在微信小程序中引入Vant组件库。 1. 确认小程序的基础库版本号 Vant组件库的版本以及对应的基础库版本可以在Vant官方文档中查看,确保你的小程序基础库版本符合要求。如果不符合要求,需要升级基础库版本。升级基础库版本需要注意,有可能会导致之前代码的兼容性问题,所以需要谨慎操作。 2. 在小程序项目中安装Vant组件库并引入 可以通过n…

    JavaScript 2023年6月11日
    00
  • 使用layui实现的左侧菜单栏以及动态操作tab项方法

    好的。使用layui实现左侧菜单栏和动态操作tab项是一个比较常见的需求,以下是实现的详细攻略。 实现左侧菜单栏 使用tree组件渲染菜单 LayUI提供了tree组件用于展示菜单栏,我们可以使用tree组件来渲染左侧菜单。 <div class="layui-col-md3"> <div class="lay…

    JavaScript 2023年6月10日
    00
  • 小程序云开发之用户注册登录

    小程序云开发是微信小程序提供的一项能力,它可以让开发者在小程序内使用云数据库、云函数等云开发能力,而无需进行繁琐的服务器搭建和API开发。在小程序中实现用户注册和登录功能,可以使用小程序云开发提供的云函数和云数据库完成。 注册用户 在小程序中,注册用户的主要步骤如下: 创建云开发环境 在使用小程序云开发前,需要先创建一个云开发环境。选择小程序开发工具中的“云…

    JavaScript 2023年6月10日
    00
  • Ajax的使用四大步骤

    当我们需要在不刷新网页的情况下更新部分数据时,可以采用Ajax技术。Ajax是Asynchronous JavaScript And XML的简称,其核心是通过JavaScript和XML来实现异步通信。下面是Ajax的使用四大步骤的完整攻略。 1. 创建XMLHttpRequest对象 在JavaScript中,创建XMLHttpRequest对象的方式如…

    JavaScript 2023年6月11日
    00
  • 时间处理工具 dayjs使用示例详解

    时间处理工具 dayjs使用示例详解 什么是dayjs dayjs是一个轻量级的处理时间和日期的Javascript库,它和moment.js类似,并且API设计相似,但是dayjs更小、更快,支持浏览器和Node.js环境。 安装dayjs dayjs提供两种方式使用:安装node模块和使用CDN。 根据使用场景进行选择,这里我们介绍如何安装node模块 …

    JavaScript 2023年5月27日
    00
  • 全面理解JavaScript中的闭包

    闭包(Closure)是JavaScript中非常重要的一个概念,由于其灵活性和特殊性,很多初学者和部分开发者难以理解。理解闭包的概念对于攻克JavaScript的高级知识和框架有很大帮助。下面是全面理解JavaScript中的闭包的完整攻略: 一、什么是闭包 闭包指的是能够访问自由变量(非全局变量,即在外层函数中定义的变量)的函数。换句话说,如果一个函数内…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部