ES6知识点整理Generator的应用

【前端知识之JS】怎么理解ES6中的Generator 本系列主要整理前端面试中需要掌握的知识点。本节介绍怎么理解ES6中的Generator。 阅读详情

Generator 函数是 一种异步编程解决方案,Generator 函数会返回一个遍历器对象,Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式。

认识generator函数

function * fn() {
  console.log('hello');
  return 'Joh';
}
// 执行fn()时不会直接执行方法体中的代码,它会返回一个指针, 这个指针实现了 interator接口,也就是返回一个interator对象
let it = fn();
// 通过调用next就会执行方法体, 返回结果是 {value:'Joh', done:true}, 其中next返回的是函数体中return的值
let res = it.next();
console.log(res);

generator函数中的yield 与 return

function * fn() {
    // 和yield相配合,把一个generator内部分为几个断点来执行,每个断点就是yield语句
    // 注意 yield和return的区别: yield可以有多个,return只能有1个
    yield 1;
    yield 2;
    yield 3;
    return 4; // 可以没有return值,done为true的value将会是undefined
  }
  let it = fn();
  // 在for-of 循环中只能打印done为false的value值,done为true时,程序终止
  for(let v of it) {
    console.log(v); // 分别输出 1 2 3
  }

yield 的值与赋值语句

function * fn(_name) {
  let name = yield _name; // yield 的默认值为undefined
  return name;
}
let it = fn('Joh');
console.log(it.next()); // {value:'Joh', done:false}
console.log(it.next('Tom')); // {value:'Tom', done:true} // 此处value应该为undefined,但是通过next参数的形式赋值改变了最后一个值
console.log(it.next('Lily')); // {value: undefined, done:true} // 已经循环完毕,即使传值也是undefined

yield 语句的位置与括号

function sum(a, b) {
  return a + b;
}
function * fn() {
  let res = sum(yield 1, 5 + (yield 3));
  console.log(res);
  console.log('my qq: ' + (yield qq)); // yield 在一个语句中需要括起来
}
fn();

yield 异常捕获

异常捕获的方式1:

function * fn() {
  let qq = yield; // yield 默认返回undefined, 不会抛出异常
  console.log(qq);
}

let g = fn();
g.next(); // 第一个断点没有输出
// g.next('qq 11111'); // 完毕之后传值输出:qq 11111
g.throw('error!'); // Uncaught error!

异常捕获的方式2:

function * fn() {
  let qq;
  try {
    qq = yield; // yield 默认返回undefined
  }catch(e){
    console.log('qq have error');
  }finally{
    console.log(qq);
  }
}
let g = fn();
g.next();
g.throw('error!');
// qq have error
// undefined

异常捕获的方式3:

function * fn() {
  let qq;
  qq = yield;
  console.log(qq);
}
let g = fn();
g.next();
try{
  g.throw('error!');
}catch(e){
  console.log('qq have error!');
}

异常捕获的方式4:

function * fn() {
  let qq;
  try {
    qq = yield ff; // ff 未定义, 所以qq不会被正确赋值 此处是非 yield 的异常
  }catch(e){
    console.log('err1');
  }
  console.log(qq);
}
let g = fn();
g.next();
g.next('qq 5554');
// err1
// undefined

利用generator和promise结合使用,让异步的逻辑关系,使用同步的方式书写

function asyncF(name) {
  return new Promise(function(resolve){
    setTimeout(function(){
      resolve('my name is ' + name);
    });
  });
}

function * fn() {
  console.log(yield asyncF('Joh'));
}

let gf = fn();

function exec(gf,value) {
  let res = gf.next(value);
  if(!res.done) {
    if(res.value instanceof Promise) {
      res.value.then(function (v) {
        exec(gf, v);
      })
    }else{
      exec(gf, res.value);
    }
  }
}
exec(gf); // my name is Joh

更复杂的写法:

function asyncF(name) {
  return new Promise(function(resolve){
    setTimeout(function(){
      resolve('my name is ' + name);
    });
  });
}

function sum(a, b) {
  return new Promise(function (resolve) {
    setTimeout(function () {
        resolve(a + b);
    });
  })
}

function * fn(name) {
  if((yield sum(3,5)) > 6) {
    console.log(yield asyncF(name));
  }else{
    console.log('error');
  }
}

let gf = fn('Joh');

// generator 执行器 相当于 tj/co 模块
function exec(gf,value) {
  let res = gf.next(value);
  if(!res.done) {
    if(res.value instanceof Promise) {
      res.value.then(function (v) {
        exec(gf, v);
      })
    }else{
      exec(gf, res.value);
    }
  }
}
exec(gf); // my name is Joh

使用纯promise实现:

function asyncF(name) {
  return new Promise(function(resolve){
    setTimeout(function(){
      resolve('my name is ' + name);
    });
  });
}

function sum(a, b) {
  return new Promise(function (resolve) {
    setTimeout(function () {
        resolve(a + b);
    });
  })
}

function fn(name) {
  sum(3,5)
    .then(function (num) {
      if(num > 6) {
        asyncF(name)
          .then(function (v) {
            console.log(v);
          })
      }else{
        console.log('error');
      }
    })
}

fn('Joh');

使用co模块,来代替自己写的执行器

var co = require('co');

function asyncF(name) {
  return new Promise(function(resolve){
    setTimeout(function(){
      resolve('my name is ' + name);
    });
  });
}

function sum(a, b) {
  return new Promise(function (resolve) {
    setTimeout(function () {
        resolve(a + b);
    });
  })
}

function * fn(name) {
  if((yield sum(3,5)) > 6) {
    console.log(yield asyncF(name));
  }else{
    console.log('error');
  }
}

var fnx = co.wrap(fn);

fnx('Joh'); // my name is Joh
DDR5内存ODT模式全解析:5种状态与实战配置指南(附时序图) 本文深入解析DDR5内存的片上终端电阻(ODT)机制,详细阐述了其五种核心状态(终结电阻禁用、RTT_WR、RTT_NOM_RD、RTT_NOM_WR、RTT_PARK)的定义、切换时序与工作原理。通过解读JESD79-5规范中的时序图,并提供基于模式寄存器的实战配置指南与代码示例,帮助硬件工程师和系统开发者优化信号完整性,解决高负载下的稳定性问题,并实现性能与功耗的最佳平衡。 阅读详情

相关推荐

新手必看:如何用T265和ROS实现无人机室内精准定位(附PX4参数配置)

本文详细介绍了如何使用Intel Realsense T265和ROS实现无人机室内精准定位,包括硬件准备、ROS数据流架构设计、PX4参数配置及系统验证。特别针对视觉SLAM技术在室内环境中的应用,提供了从零搭建到进阶优化的全流程解析,适合无人机开发新手快速上手。

weixin_30642561的博客 406

ES6:Generator生成器的介绍及场景应用

文章目录一、Generator生成器函数二、使用步骤1.引入库2.读入数据总结 一、Generator生成器函数 在JavaScript中,一旦一个函数开始执行,就会一次执行到最后或者遇到return时结束,在函数运行期间没有任何代码可以让它在执行过程中暂停。 而Generator生成器函数的出现,使得这样一个不可能成为可能。 Generator函数是ES6提供的一种异步编程解决方案,其形式上与普通函数稍微有些差别: function关键字后跟一个星号(*) yield语句可以暂停函数 functio

weixin_60297362的博客 1827

C#实战:如何用HslCommunication快速搞定三菱FX5U PLC通讯(附完整代码)

本文详细介绍了如何利用HslCommunication库在C#环境中快速实现与三菱FX5U PLC的通讯。通过实战代码演示,从环境搭建、建立连接、核心数据读写到构建健壮的监控服务,系统讲解了如何高效完成数据采集与交互,大幅提升工业自动化项目的开发效率。

s4t5u6v的博客 1202

ES6中Generator的应用

Generator 介绍 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同,Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。执行 Generator 函数会返回一个遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。 Generator函数有两个特征: function关键字与函数名之间有个星号; 函数内部使用yield表达式 fun.

qq_51066068的博客 696

Jetson平台XDMA PCIe驱动安装与测试全指南

本文提供了一份在NVIDIA Jetson平台上安装与测试Xilinx FPGA XDMA PCIe驱动的完整指南。详细阐述了驱动作为高速DMA引擎的核心作用,并逐步讲解了从环境准备、驱动编译、内核模块加载到实际数据传输测试的全过程。内容涵盖常见问题排查与性能优化建议,帮助开发者实现Jetson与FPGA间的高速数据通信,适用于自动驾驶、工业视觉等需要异构计算的应用场景。

weixin_29196315的博客 528

循环卷积和线性卷积(矩阵视角)

矩阵视角的循环卷积核线性卷积

shengsong 3582

Generator 函数的异步应用

Generator 函数的异步应用 本章主要介绍 Generator 函数如何完成异步操作。 1、基本概念 异步编程方法 ES6 诞生以前,异步编程的方法,大概有下面四种:回调函数、事件监听、发布/订阅、Promise 对象 回调函数 回调函数,就是把任务的第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直...

MichaelAn的博客 277

Ubuntu 22.04 安装 PostgreSQL + AGE + pgvector 完全指南

本教程详细介绍了在Ubuntu 22.04服务器上安装PostgreSQL数据库,并为其添加AGE图数据库扩展和pgvector向量搜索扩展的步骤。首先,更新系统并安装PostgreSQL,然后通过源码构建并安装AGE和pgvector扩展。接着,配置PostgreSQL以使用这些扩展,并可选地允许远程连接。教程还包括创建用户、设置密码、验证安装以及安装后的优化建议。最后,提供了常见问题的解决方法。通过本教程,用户可以在同一数据库中处理关系型数据、图数据和向量数据,为现代应用程序提供强大的数据支持。

这个是个人博客,记录生活中的一些日常。 1743

generator函数的应用

(1)取代promise的异步操作 promise的方法: Promise.resolve(step1) .then(step2) .then(step3) .then(step4) .then(function (value4) { // Do something with value4 }, function (error) { // Handle a...

Lpd_Reason的博客 546

Matlab波动光光学系统

波动光学是一种研究光波传播过程的理论,按照其处理的信息类型不同,可以分为相干和非相干波动光学,相干波动光学可以用作特定光学系统的分析和设计,其主要依赖物理光学和电磁波的基本原理,以及光学干涉和衍射的经验方程式,其中光波传播过程是以复数形式表示的,包括振幅和相位两个方面。近年来光学技术得到了广泛的应用和发展,波动光光学系统是其中一种重要的光学系统,它主要是利用波动光学原理,通过计算机模拟实现各种光学系统的设计、分析和优化,可应用于大气光传输、光束整形、分析系统的衍射和干涉特性,包括利用。

weixin_50547796的博客 262

js逆向-逆向部分技巧总结

js逆向-逆向部分技巧总结

Deng872347348的博客 2134

es6之generator函数的应用

generator函数的应用generator函数的应用 generator函数的应用 最近在学习到redux-saga用法的时候,发现其中大量用到了es6中新增的Generator函数,在学习Generator函数的同时,整理了一些关于Generator函数的基本应用,这篇文章不涉及到Generator函数的基本用法,关于基本语法知识大家可以参考[这里](http://es6.ruanyifen...

astonishqft的博客 879

Xilinx平台SRIO介绍(一)RapidIO协议介绍

菜鸟到老鸟:会用工具; 老鸟到大佬:深入理解原理。 ——FPGA大叔·沃自己硕得

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

22个关于ES6的最新面试题汇总整理

作者:StevenLikeWatermelonhttps://juejin.cn/post/6844903734464495623近期在复习ES6,针对ES6新的知识点,以问答形式整理一...

前端达人 8632

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ES6面试题整理汇总

ES6面试题整理汇总

山雀的博客 8450

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

es6 filter函数的用法_ES6语法重点整理

目录:数组、函数、Symbol和对象Proxy和ReflectGenerator函数和Promise对象Class、ModuleES6简介:ECMAScript6是JavaScript语言的下一代标准,在2015年6月正式发布。其目标是使JavaScript语言可用于编写复杂的大型应用程序,成为企业级开发语言。本文参考:《ES6 标准入门》阮一峰,《JavaScript权威指南》、JavaScri...

weixin_36444911的博客 1393

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

es6新特性_前端关于ES6的面试题汇总含答案

ES6全称是ECMAScript6,它可以帮助JavaScript语言成为企业级开发语言,编写大型且复杂的应用程序。在前端面试中,ES6也是一个经常出现的考点。本文整理汇总了ES6相关的面试题以及对应的参考答案,大家可以在面试前梳理一遍相关知识点,用最好的状态去迎接面试。 1.聊聊 promise?promise 是一个异步函数,主要是为了解决异步处理回调地狱(也就是循环嵌套的问题)而产生的,有 ...

weixin_39725154的博客 3856

JavaScript ES6语法新特性整理,ES6必须掌握的知识点,更强大更方便

ECMAScript 6入门

苛学加记事 845

【ES】1475- 爆肝22个ES6知识点

近期在复习ES6,针对ES6新的知识点,以问答形式整理一个全面知识和问题汇总。一、问:ES6是什么,为什么要学习它,不学习ES6会怎么样?答:ES6是新一代的JS语言标准,对分JS语言核心内容做了升级优化,规范了JS使用标准,新增了JS原生方法,使得JS使用更加规范,更加优雅,更适合大型应用的开发。学习ES6是成为专业前端正规军的必经之路。不学习ES6也可以写代码打鬼子,但是最多只能当个游击队长。...

pingan8787 682

JavaScript总结 JS ECMAScript 2015又称ES6 ES6语法大全 个人笔记整理 收集整理ES6 所新增的语法以及使用方法 ES6语法整理

JavaScript总结 JS ECMAScript 2015又称ES6 ES6语法大全 个人笔记整理 收集整理ES6 所新增的语法以及使用方法 ES6语法整理

前端开发工程师 全栈工程师 熟悉前后端 熟悉基本的生物信息软件使用以及分子对接技术服务 1288

es6基础知识点整理二-------面向对象,json,Promise,generator

面向对象 es5面向对象写法 在es5中,构造函数和类其实是一个东西 // 构造函数 function User(name,pass){ this.name = name; this.pass = pass; } // 使用prototype增加方法 User.prototype.showName = function (){ alert(this.name); ...

couch potato的博客 231

ES6--generator概念及写法(含yield与next执行机制分析)_generator遇见return也会停止执行

用来在一个 Generator 函数里面执行另一个 Generator 函数与不加*的对比// foo同上// 不加*的对比yield*可接收所调用Genertor函数return的值// foo同上// 如果yield* 接收的 Generator 函数带有return语句,return返回的数据可以被接收。任何有Iterator接口的数据结构都可以被yield*遍历, 如字符串会遍历每个字符。数组会遍历每个元素。// hello。

m0_61043185的博客 920

ES6知识点整理之----Generator----概述

1、ES6 提供的一种异步编程解决方案 2、是一个状态机,封装了多个内部状态。 3、是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。 4、Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态。 function* ...

ap1005233的博客 231

ES6用法整理

ES6用法整理let 和 const扩展运算符(...)Set 和 MapPromiseProxy 和 ReflectGenerator函数 和 async 函数Class类 let 和 const ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 { let a = 10; var b = 1; } a // Refer...

曹天笑_笑笑笑的博客 431

ES6面试、复习干货知识点汇总

关注上方“前端开发博客”,选择“设为星标”回复“2”加入前端群作者:StevenLikeWatermelon https://juejin.cn/post/6844903734464495...

前端开发博客 1万+

ES6 新增功能点整理

1、webpcak 打包工具 入口 (entry) 输出 (output) loader 插件 (plugins) 2、gulp 自动化构建工具 const gulp = require('gulp'); // default 表示一个任务名,为默认执行任务 gulp.task('default', function() { // 放置默认的任务代码 }) 3、新的关键字 let 、const let 作用域在当前代码块 (var 是全局) const 定义只读变量,值不能变化...

bihansheng2010的博客 1050
上一篇: ES6知识点整理Symbol的应用
下一篇: ES6知识点整理Set的应用
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值