Promise+async+Generator的实现原理

下面是 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设计模式

    常用的JavaScript设计模式 设计模式是在经验总结的基础上,提炼出的一些经典模板化的软件设计经验。在JavaScript中,同样存在一些常用的设计模式,这些设计模式可以帮助开发者快速、高效地完成开发任务。下面是常用的JavaScript设计模式: 1. 单例模式 单例模式是指一个类只能被实例化一次,并且提供了访问该实例的全局访问点。它在JavaScri…

    JavaScript 2023年5月18日
    00
  • JavaScript生成.xls文件的代码

    生成Excel文件是前端开发中常见的需求之一,可以通过JS库来实现。目前比较流行的库有两个:SheetJS和Handsontable,本文将以SheetJS为例来讲解如何使用JS生成Excel文件的完整攻略。 SheetJS库介绍 SheetJS是一组用于处理Excel文件的JS库,可读取、修改和写入Excel文件,支持XLS、XLSX等多种格式。同时She…

    JavaScript 2023年5月19日
    00
  • js动态设置div的值下例子

    下面让我来详细讲解“js动态设置div的值”的完整攻略。 基本概念 在开始具体的实现代码之前,我们先来了解一下这个问题的基本概念。 动态设置div的值:指的是通过JavaScript脚本代码实现在网页中的某个元素(如div)中动态设置内容,而不是直接在HTML代码中写死。 实现过程 实现动态设置div的值可以分为以下两个步骤: 1. 获取div元素 在Jav…

    JavaScript 2023年6月11日
    00
  • JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码

    获取本月第几周、本月共几周、本月有多少天 首先,我们可以使用Date对象来获取当天的日期。通过获取当前日期的月份和年份,可以计算出本月有多少天。同时,我们可以使用getDay()方法来获取当前日期是星期几,然后在计算出本月的第几周以及本月共几周。 下面是获取本月第几周、本月共几周和本月有多少天的示例代码: // 获取当前日期 const date = new…

    JavaScript 2023年6月10日
    00
  • 17个JavaScript 单行程序

    JavaScript 是一门非常重要的编程语言,具有广泛的应用。在网上,有很多有趣的JavaScript 单行程序,它们虽然只有一行代码,但是实现的功能很有趣。接下来,我来为大家详细讲解 “17个JavaScript 单行程序”的完整攻略,希望对大家学习JavaScript编程有所帮助。 先列出这 17 个单行程序: 在控制台输出一个笑脸 ? 反转字符串 统…

    JavaScript 2023年5月18日
    00
  • 5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例

    5个数组Array方法:indexOf、filter、forEach、map、reduce使用实例 一、介绍 数组是JavaScript中最常用的数据类型之一。使用数组的时候,我们经常需要使用到一些方法对数组进行操作,比如获取某个元素的下标、筛选元素、遍历元素、处理元素等等。本篇攻略将详细讲解五个数组Array方法:indexOf、filter、forEac…

    JavaScript 2023年5月27日
    00
  • JavaScript图片的Base64编码以及转换详解

    JavaScript图片的Base64编码以及转换详解 在进行前端开发时,我们会遇到需要将图片转换为Base64编码的情况,本篇攻略将会详细讲解JavaScript如何进行图片的Base64编码以及如何进行Base64编码的还原。 图片的Base64编码 在JavaScript中,可以使用FileReader的方法将图片读取为base64格式的字符串,具体步…

    JavaScript 2023年5月19日
    00
  • 详解JavaScript中的事件流和事件处理程序

    详解JavaScript中的事件流和事件处理程序 JavaScript中的事件是指用户与网页进行交互时所产生的所有动作,比如鼠标点击、键盘敲击、窗口滚动等等。JavaScript需要对这些事件进行处理,而事件的类型和顺序则由事件流来控制。本篇文章将详细介绍JavaScript中的事件流和事件处理程序,并提供示例说明。 事件流 事件流描述的是从页面中接收事件的…

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