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日

相关文章

  • 利用js动态添加删除table行的示例代码

    当需要在网页中展示和处理数据时,使用table是一种非常常见的方式。在一些场景下,需要动态地添加或删除表格行,这就需要使用JavaScript进行操作。下面是一份利用js动态添加删除table行的示例代码攻略。 1. HTML结构 首先,我们需要在HTML中定义一个table,标记好每一列的thead和tbody,并预留出一行作为模板行。 <table…

    JavaScript 2023年6月11日
    00
  • ASP 快速执行动态网页

    ASP(Active Server Pages)是一种用于快速执行动态网页的技术。它能够将HTML页面与动态代码结合起来,使得网页可以动态地生成内容,从而大大提高了网页的交互性和可读性。下面是ASP快速执行动态网页的完整攻略: 确认服务器支持ASP技术在使用ASP技术之前,首先需要确认服务器是否支持ASP技术。一般情况下,IIS服务器都是默认支持ASP技术的…

    JavaScript 2023年6月11日
    00
  • Javascript倒计时(定时)执行跳转事件的代码

    下面我将详细讲解“Javascript倒计时(定时)执行跳转事件的代码”的完整攻略。 目标 我们的目标是在网页上实现倒计时(定时)功能,到达指定的时间后自动跳转到某一个指定页面。 实现思路 实现该功能的思路如下: 获取当前时间和目标时间之间的时间差,并通过一定算法将其转换成剩余的天数、小时数、分钟数、秒数。 通过 JavaScript 中的 setInter…

    JavaScript 2023年5月27日
    00
  • JavaScript 日期和时间的格式化方法

    JS 日期和时间的格式化方法在开发中经常会用到,可以将日期和时间按照指定格式输出。下面是一份详细的攻略。 日期和时间的格式化方法 在JavaScript中,日期和时间可以使用 Date() 对象来表示。而要对日期进行格式化,就需要将 Date() 中的内容按照指定的格式进行输出。下面介绍三种常见的格式化方式。 1. 使用 toDateString() toD…

    JavaScript 2023年5月27日
    00
  • JS中map和parseInt的用法详解

    下面为大家详细讲解“JS中map和parseInt的用法详解”攻略: JS中map和parseInt的用法详解 map()方法 map()方法是JS中数组原型的一种方法,可用于对数组中每个元素进行操作,返回操作后的新数组,实现方式如下: const arr = [1, 2, 3]; const newArr = arr.map((item, index) =…

    JavaScript 2023年5月27日
    00
  • 微信小程序单选框自定义赋值

    微信小程序中的单选框组件通常会使用预设选项进行赋值。但有时候,我们需要自定义单选框的选项内容和值。下面是一些实现自定义单选框赋值的方法: 方式一:使用wx:for循环渲染视图和数据 我们可以使用wx:for指令和数组来实现自定义单选框赋值。首先,定义一个数组用于存储单选框的选项,数组中每一项表示单选框的一个选项,包含一个name属性表示选项文本,一个valu…

    JavaScript 2023年6月11日
    00
  • input 日期选择功能的javascript代码

    下面就为你详细讲解“input日期选择功能的javascript代码”的完整攻略。 为 input 元素添加日期选择 使用 input 元素时,我们经常需要选择日期。在 HTML5 中,我们可以使用 input 元素的 type 属性设置为 date 来显示日期选择控件。例如: <input type="date" id=&quot…

    JavaScript 2023年5月27日
    00
  • JavaScript类的继承全面示例讲解

    JavaScript中的类继承是面向对象编程中的重要概念,它可以使得类与类之间实现代码的共享、重用以及扩展。在这里我们将详细讲解JavaScript类的继承全面示例讲解。 一、继承的概念 继承是指从已有的类中派生出新的类,新的类能够继承已有类的属性和方法,并且可以在此基础上添加自己的属性和方法。继承的概念可以使代码得到更好的复用性和灵活性。 二、JavaSc…

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