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日

相关文章

  • ant-design-pro 的EditableProTable表格验证调用的实现代码

    Ant Design Pro 的 EditableProTable 组件提供了表格验证的功能,其实现的关键在于将验证规则通过装饰器传递给 EditableTable 组件。下面是具体实现步骤: 安装依赖 在项目中增加对 rc-form 和 formik 包的依赖。 npm i rc-form formik 创建验证规则 可通过使用 formik 包中提供的 …

    JavaScript 2023年6月10日
    00
  • js图片上传中file、bolb、base64图片之间的相互转化

    为了详细讲解“js图片上传中file、bolb、base64图片之间的相互转化”的完整攻略,我们需要分别了解它们都代表着什么,以及相互之间的转换方式: File类型 File类型表示一个文件,通常是从用户计算机中选定的文件。File对象通常与input元素一起使用,而用于上传文件。File对象包含了文件的名称、文件大小、类型以及最后修改的时间等信息。 将Fi…

    JavaScript 2023年5月27日
    00
  • javascript判断两个IP地址是否在同一个网段的实现思路

    实现IP地址判断是否在同一个网段,可以使用Javascript实现的思路如下: 首先将IP地址转换成二进制格式,方便进行比较,然后将子网掩码也转换成二进制格式。 对转换后的IP地址和子网掩码进行&(与运算),得到的结果就是该IP地址所在的网络地址。 将要比较的两个IP地址按照以上步骤进行转换得到两个网络地址。 比较两个网络地址是否相同,如果相同,则说…

    JavaScript 2023年6月11日
    00
  • 解决vue中使用history.replaceState 更改url vue router 无法感知的问题

    在Vue Router中,要想改变URL但不重新加载页面,可以使用history.pushState()或history.replaceState()方法。但有时使用history.replaceState()方法更改URL后,Vue Router可能无法感知URL的改变,从而不会更新视图,这可能是由于缺少路由监视或未调用Vue Router API的原因。…

    JavaScript 2023年6月11日
    00
  • JavaScript 对象、函数和继承

    JavaScript 中的对象和函数都是重要的概念。对象是一组键值对的集合,可以包含函数,而函数是执行任务和返回值的代码块。继承是一种机制,它允许我们在一个对象上定义对象的属性和属性行为,并通过 “继承”,使一个对象能够访问另一个对象的属性和方法。 JavaScript 对象 JavaScript 中的对象是由花括号 {} 包裹的一组键值对。例如: let …

    JavaScript 2023年5月27日
    00
  • jQuery插件Validation表单验证详解

    jQuery插件Validation表单验证详解 表单验证是Web开发中非常重要的一环,jQuery插件Validation就是基于jQuery实现的一款表单验证插件,非常方便实用。本篇文章将会详细讲解jQuery插件Validation的使用方法,以及常见的验证规则和自定义验证规则。 页面引入jQuery和jQuery Validation插件 首先,将j…

    JavaScript 2023年6月10日
    00
  • React组件通信之路由传参(react-router-dom)

    React组件之间的通信是一个非常常见的需求,而路由参数传递是其中一种传递参数的方式。本文将详细讲解如何在React应用中通过react-router-dom库实现路由参数传递。 什么是路由参数传递 路由参数传递就是在通过路由跳转到指定页面时,在路由路径上携带一些参数,在跳转后的页面中可以通过某些方式获取这些参数。这种方式通常用于在不同的组件之间传递一些参数…

    JavaScript 2023年6月11日
    00
  • 微信小程序 页面跳转和数据传递实例详解

    微信小程序 页面跳转和数据传递实例详解 一、页面跳转 在微信小程序中,页面跳转有两种方式,分别是: wx.navigateTo:保留当前页面,跳转到应用内的某个页面。可通过wx.navigateBack方法返回到原页面。 wx.redirectTo:关闭当前页面,跳转到应用内的某个页面。不可通过wx.navigateBack方法返回到原页面。 1. wx.n…

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