首页 > 其他分享 >[JS] generator基本使用

[JS] generator基本使用

时间:2024-07-13 17:42:49浏览次数:7  
标签:基本 return generator yield next done JS throw

next方法与yield关键字

generator函数可以返回一个迭代器,通过next方法切换generator的状态。

generator函数被调用时并不会执行内部的语句,而是返回一个迭代器对象。

迭代器对象首次调用next方法,才开始执行generator函数的语句。

直到遇到yield语句,内部的执行中断,返回yield关键字右侧表达式的值作为迭代器调用next方法的返回值。

yield语句本身没有返回值,由下一次调用next方法时传入参数作为yield的返回值。

function* gen(){
  yield 'hello';
  let msg = yield 'world';
  console.log(msg);
  yield 'end';
}

const g = gen();

console.log(g.next());
console.log(g.next());
console.log(g.next('passing msg'));
console.log(g.next());

输出结果

{ value: 'hello', done: false }
{ value: 'world', done: false }
passing msg
{ value: 'end', done: false }
{ value: undefined, done: true }

throw方法

迭代器对象可以通过调用throw方法向generator函数内部“抛出”异常,在函数内部通过try/catch捕获。

也可以在generator函数内部抛出异常,在调用迭代器方法的位置抛出异常。

向内部抛出异常 - 分类讨论

  1. (理想情况)调用iterator.throw(new Error(...))向内部抛出异常,在内部对应的yield表达式使用try/catch捕获异常;
  2. 如果函数内部没有捕获异常,那么在iterator.throw()语句所在的位置抛出异常;
  3. 如果generator内部和iterator.throw所在位置都没有捕获异常进行处理,那么程序终止;
  4. 还没首次执行next就执行throw,直接在外部调用iterator.throw的位置抛出异常。

向外抛出异常

接下来先看一个向外抛出异常的案例代码:

function* gen(){
  yield 1;
  throw new Error('inner error');
  yield 2;	// 不会被执行
  yield 3;	// 不会被执行
}

const g = gen();

let res;
do{
  try{
    res = g.next();
    console.log(res);
  }catch(e){
    console.log(e);	// 捕获到 'inner error'
  }
}while(!res.done);

运行结果:

{ value: 1, done: false }
Error: inner error
{ value: undefined, done: true }

解析:在generator内部使用throw关键字抛出异常,外部调用iterator.next的地方捕获异常,由于generator抛出异常,JS引擎会认为这个generator已经运行结束了,后续的yield不会执行,迭代器的done变为true

return关键字

没有写return语句的 Generator 函数默认在尾部返回undefined

return关键字会返回右侧表达式的值作为next方法的返回值。

return会终止generator,后续的代码都不会执行了,这个特点和普通函数保持一致。

function* gen(){
  yield 1;
  return 2;
  yield 3;
}

const g = gen();

let res;
do{
  res = g.next();
  console.log(res.value);
}while(!res.done);

执行结果

1
2

return 方法

generator函数返回的迭代器对象还有return方法。

可以在外部手动得到return方法得到的值,并且结束generator。

function* gen(){
  yield 1;
  yield 2;
  yield 3;
}

const g = gen();

console.log(g.next());
console.log(g.return('done'));
console.log(g.next());

运行结果

{ value: 1, done: false }
{ value: 'done', done: true }
{ value: undefined, done: true }

next、throw、return的共同点

这三个方法的本质是让generator函数恢复执行,并且使用不同的语句替换yield表达式。

  • next()yield表达式替换成一个值;
  • throw()yield表达式替换成一个throw语句;
  • return()yield表达式替换成一个return语句。

标签:基本,return,generator,yield,next,done,JS,throw
From: https://www.cnblogs.com/feixianxing/p/18300402/javascript-es6-generator-basic-usage

相关文章

  • Html5前端基本知识整理与回顾上篇
    今天我们结合之前上传的知识资源来回顾学习的Html5前端知识,与大家共勉,一起学习。目录介绍了解注释标签结构排版标签标题标签​编辑段落标签​编辑换⾏标签​编辑⽔平分割线⽂本格式化标签媒体标签绝对路径相对路径音频标签格式​编辑注意点视频标签格......
  • 解决HBuilder X运行微信小程序模拟器Error: pages.json解析失败
    前言如果已经排查很久了,那这就不是你的问题了,大概率是由于你曾经创建了一个路径,在指定PagePath的时候又指向了这个路径,这个操作本身没有问题。但是,如果你曾经对这个路径修改过了,那编译器就会有问题,来品鉴一下这个错误。16:15:36.772请注意运行模式下,因日志输出、sourcem......
  • nodejs微信支付安全证书下载,亲测有效
    微信支付是目前非常流行的支付方式之一,很多开发者在集成微信支付时需要下载并使用微信支付的安全证书。本文将详细介绍如何在Node.js环境中下载微信支付安全证书,并提供一个亲测有效的示例代码。前置条件在开始之前,请确保你已经具备以下条件:已注册微信支付商户,并获得商户号和AP......
  • js 树形数组转一维数组,或一维数组转树形数组
    树形数组转一维数组要将一棵树结构(包含children属性)拍平为一个一维数组,可以使用递归或迭代的方法。下面是两种常见的实现方式:1.使用递归functionflattenTree(tree){letresult=[];tree.forEach(node=>{result.push(node);if(node.children){......
  • ubuntu 基本操作
    安装输入法参考Ubuntu22.04安装搜狗输入法【经验分享】Ubuntu24.04安装搜狗输入法(亲测有效)[问题求助]安装搜狗输入法显示fcitx依赖不足该怎么处理desktop快捷方式检测desktop文件desktop-file-validatemyapp.desktop更新.desktop数据库更新如下两个位置的.de......
  • 9.pwn 栈溢出(基本ROP)
    栈溢出简介函数中的存储在栈中的局部变量数组边界检查不严格发生越界写,造成用户输入覆盖到缓冲区外的数据内容,由于栈中同时存在着与函数调用参数的相关信息,栈溢出可以导致控制流劫持基础栈溢出(helloworldinpwn)多数情况下我们需要让程序执行这一段代码般来说,在CTF中的P......
  • 基于ssm+vue.js+uniapp的汽车养护管理系统附带文章和源代码部署视频讲解等
    文章目录前言详细视频演示具体实现截图技术栈后端框架SSM前端框架Vue持久层框架MyBaits系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于springboot+vue.js+uniapp的江西郊医院血库管理系统附带文章源码部署视频讲解等
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaits系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 全栈物联网项目:结合 C/C++、Python、Node.js 和 React 开发智能温控系统(附代码示例)
    1.项目概述本文详细介绍了一个基于STM32微控制器和AWSIoT云平台的智能温控器项目。该项目旨在实现远程温度监控和控制,具有以下主要特点:使用STM32F103微控制器作为主控芯片,负责数据采集、处理和控制逻辑采用DHT22数字温湿度传感器,精确采集环境温湿度数据通过ESP8266WiF......
  • python制作甘特图的基本知识(附Demo)
    目录前言1.matplotlib2.plotly前言甘特图是一种常见的项目管理工具,用于表示项目任务的时间进度直观地看到项目的各个任务在时间上的分布和进度常用的绘制甘特图的工具是matplotlib和plotly主要以Demo的形式展示1.matplotlib功能强大的绘图库,适合制作静态......