Generator

Promise 与 generator函数 Promise 与 generator函数一. 回调地狱二. Promise使用PromiseGenerator 函数 作者: DocWhite白先生 什么是Promise?如果还不知道什么是Promise推荐读 阮一峰老师的ES6入门 里面有关于 ES6新特性和Promise更全面和学术话的介绍。 一. 回调地狱 在说Promise之前,先聊聊一个前端开发最常见的烦恼:回调地狱,什么是回调回调地... 阅读详情

简介:

生成器,本身是函数,执行后返回迭代对象,函数内部要配合yield使用Generator函数分段执行,遇到Yields即暂停

特点:

function和函数名之间需要带*

函数体内部Yield表达式,产出不同的内部状态

function* test() {
    let value1 = yield 'a'
    console.log(value1)
    let value2 = yield 'b'
    console.log(value2)
    yield 'c'
    yield 'd'
    return 'e'
}

let oG = test()

oG.next('chen') //因为执行完yield之后会暂停,所以后边的赋值语句不会进行,类似一个蛇形样子

现在我们要实现一个场景:
这个场景是去name.txt文件中读取一个文件路径’./number.txt’,然后在number.txt文件中读取到最终的数字

这个是公共代码部分,稍后还会继续用到

const fs = require('fs')
function readFile(path) {
    return new Promise((res, rej) => {
        fs.readFile(path, 'utf-8', (err, data) => {
            if (err) {
                return rej(err)
            } else {
                return res(data)
            }
        })
    })
}

我们最初会有这么一个思路:直接嵌套调用。但是如果嵌套多了之后是不是很不舒服,代码看起来也不优雅。

readFile('./name.txt').then(res => {
    readFile(res).then(res => {
        console.log(res)
    })
}).catch(err => {
	// 省略,不是重点
})

现在我们可以借用Generator去实现:

// 进行封装的原因是yield的调用是暂停的,不连续
function Co(oG) {
    return new Promise((res, rej) => {
        let next = (data) => {
            let { value, done } = oG.next(data)
            if (done) {
                res(value)
            } else {
                value.then(val => {
                    next(val)
                }).catch(err => {
                    return rej(err)
                })
            }
        }
        next()
    })
}

function* read() {
	// 并非是把迭代对象{value: '', done: ''}付给了value1
	// 封装Co正是为了解决这个问题
    let value1 = yield readFile('./name.txt')
    let value2 = yield readFile(value1)
    return value2
}

// 最终只需这样调用,对于之后开发的类似场景就直接调用即可
Co(read()).then(res => {
    console.log(res)
}).catch(err => {
    console.log(err)
})

其实await + async语法糖对其进行了进一步的封装,可以参靠文章

CC代码生成器 一般现在毕竟流行的代码生成器,都依据一些用了好些年的原则: 1,三层架构 2,成熟的数据访问层 3,实体类跟数据库的表映射起来,生成多文件一一对应 实现原理实际就是模板批量替换,写这个软件的人把那些已经被成熟应用很多年的东西总结成一套模板,然后根据你创建的数据库里的每一个表,来替换模板,生成相应的实体层、数据访问层、业务逻辑层…… 立即下载

相关推荐

webpack性能优化-optimization.splitChunks.chunks中的“all“、“async“和“initial“

最初,chunks(以及内部导入的模块)是通过内部 webpack 图谱中的父子关系关联的。CommonsChunkPlugin 曾被用来避免他们之间的重复依赖,但是不可能再做进一步的优化。 ——摘自 webpack 从 webpack v4 开始,移除了 CommonsChunkPlugin,取而代之的是 optimization.splitChunks。 而关于 optimization.splitChunks 中的chunks,webpack 官方文档却没有很好的进行举例解释,只说明了 async.

程序员秋风的博客 3137

Generator函数

1、什么是 Generator 函数 在Javascript中,一个函数一旦开始执行,就会运行到最后或遇到return时结束,运行期间不会有其它代码能够打断它,也不能从外部再传入值到函数体内 而Generator函数(生成器)的出现使得打破函数的完整运行成为了可能,其语法行为与传统函数完全不同 Generator函数是ES6提供的一种异步编程解决方案,形式上也是一个普通函数,但有几个显著的特征: function关键字与函数名之间有一个星号 “*” (推荐紧挨着function关键字) 函数体内使用 yi

qq_43239667的博客 1万+

炸金花游戏(3)--基于EV(期望收益)的简单AI模型

前言:   炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章:  德州扑克AI--Programming Poker AI(译).  系列文章说来惭愧, 之前一直叫嚷着写德州AI, 不过可惜懒癌晚期, 一直没去实践, T_T. 相比而言,***简单很多, 也更偏重于运...

weixin_30377461的博客 2342

es6中的generator函数详解

generator函数 1.generator是什么: generator是一个迭代生成器,其返回值为迭代器(lterator),是ES6标准引入的新的数据类型,它借鉴于Python中的generator概念和语法; 迭代器协议: 定义了一种标准的方式来产生一个有限或无限序列的值; 当一个对象被认为是一个迭代器时,它实现了一个 next() 的方法,next()返回值如下: { done:tr...

田兴的博客 5903

CarPlay wired(USB)连接方案

CarPlay的wired(USB)的连接方案要求车载设备至少要支持USB2.0 Hi-Speed,支持USB Host Mode,该模式要求车载设备能够工作在USB device模式下,因为Apple设备在CarPlay中是作为USB Host的。而通常情况下,车载设备USB是工作在USB Host模式的,而外接的USB设备是工作在USB Device模式的,因而在这种情况下的CarPlay wired(USB)连接方案中就需要进行USB的模式切换。模式切换完成后便是Apple设备(USB HOST)的枚

Ke8323的博客 1万+

遥感影像分割实战:LoveDA数据集从下载到训练全流程指南(附避坑技巧)

本文以LoveDA数据集为例,提供了一份详尽的遥感影像语义分割实战指南。内容涵盖从数据下载、理解与预处理,到环境配置、模型选择与训练,再到性能调优与部署的全流程,并重点分享了多个关键环节的避坑技巧,旨在帮助开发者和研究者高效上手并解决实际问题。

cherry的博客 930

python yield generator 详解

  本文将由浅入深详细介绍yield以及generator,包括以下内容:什么generator,生成generator的方法,generator的特点,generator基础及高级应用场景,generator使用中的注意事项。本文不包括enhanced generator即pep342相关内容,这部分内容在之后的博文介绍。 generator基础   在python的函数(function)...

weixin_34239592的博客 1413

FPGA以太网接口设计避坑指南:GMII与RGMII时序转换的三种实现方案对比

本文深入解析FPGA以太网接口设计中GMII与RGMII时序转换的三种实现方案,包括Xilinx官方IP核、手工原语逻辑和开源方案gmii_to_rgmii。通过对比分析各方案的优缺点和适用场景,为工程师提供技术选型指南,帮助避免常见设计陷阱,提升高速网络设备开发的效率和可靠性。

weixin_42570484的博客 388

Xcode 自动属性生成器(强力推荐)

一次偶然机会从git上找到,可惜没有添加关注。现在忘记从哪里clone 出来了。 应该是目前最好用的自动补上属性    @property()xx    @syn delloc 功能。     代码 写道 #! /usr/bin/perl -w # Created by Matt Gallagher on 20/10/08. # Copyright 2008 Matt...

艺术的以太 iPhone Mac Cocoa Ruby Rails 344

js逆向实战:爬取淘宝男装商品

本文介绍了一个淘宝商品数据爬取程序的技术实现方案。该程序通过分析淘宝H5页面接口,实现了商品名称、价格、销量等关键信息的抓取,并支持图片下载功能。核心内容包括:1. 使用Request库发送HTTP请求获取数据;2. 通过逆向分析淘宝的签名算法(MD5加密)生成合法请求;3. 解析JSON数据并提取商品信息;4. 处理分页参数实现多页数据爬取;5. 将数据保存为CSV文件并下载商品图片。程序还实现了反爬虫绕过、错误处理、文件管理等辅助功能,完整展示了从数据采集到存储的全过程。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1574

[RK3568 Android11] 开发之默认授予系统预置的APP权限

目录 一、系统预置的APP权限 二、默认授予系统预置的APP权限 一、系统预置的APP权限 1、在打开系统预置的APP时,都会弹窗提示,并且需要人工确定授予权限; 2、有些客户对定制有需求,需要系统预置的APP自动默认授予权限; 二、默认授予系统预置的APP权限 注意此方法只对系统预置的APP起效果,后期手动安装的APP无效; 修改文件: frameworks/base/services/core/java/com/android/server/pm/per...

~未来可期~ 5059

ES6 Generator生成器——同步异步生成器

Generator函数通过yield和next()的协作,提供了一种灵活控制执行流程的机制。它在处理大型数据流、异步编程(需结合Promise或async/await)、状态机等场景中表现出色,是JavaScript中实现复杂控制逻辑的重要工具。嗯,我现在需要详细解释JavaScript中的AsyncGenerator。首先,根据我搜索到的资料,我应该从不同的来源整理信息,确保覆盖定义、构造、方法、使用示例以及与同步生成器的区别等方面。

警警的博客 1650

诊断CAPL自动化(3)——封装了接收诊断数据的通用CAPL脚本函数库

DiagGetRespPrimitiveSize (获取诊断响应的单个数据) diagGetPrimitiveData (获取诊断返回的所有数据) DiagGetRespParameter(数值类型) DiagGetRespParameter(字符串类型) DiagGetRespParameter(byte数组)

蚂蚁小兵 6222

简单的GENERATOR

PEP:  255题目:  简单的GENERATOR版本:  $修订本: 1.18 $作者:  Neil Schemenauer , Tim Peters , Magnus Lie Hetland 讨论区:  python-iterators@lists.sourceforge.net状态:  定型本类型:  标准轨迹要求:  234 完成时间:  18-May-2001Python版本号:

monkst的专栏 1709

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JavaScript系列——Generator

在生成器内部,可以通过yield 来返回每一个操作步骤需要返回的内容,然后调用实例的next 方法,返回对应步骤的返回值。,将next 封装到then会调用函数,这个细节可以使得主线程执行完任务,再去任务队列执行next,实现主线程不阻塞。,原因是因为如果直接调用next,那么主线程就会一直阻塞在这个函数内部,直到执行所有的generator步骤。在介绍异步的时候,介绍过使用 async + await的方式处理promise,代码可以更加有可读性,其实。上面的代码可以实现,间隔一秒打印1,2,3。

1337

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

generator函数详解

Generator 函数的定义 语法上,Generator 函数是一个状态机,封装了多个内部状态。 形式上,Generator是一个函数。不同于普通函数,是可以暂停执行的,所以函数名之前要加星号,以示区别。 整个Generator函数就是一个封装的异步任务,或者说是异步任务的容器,异步操作需要暂停的地方,都用yield语句。 什么是Generator函数 function 关键字和函数之间有一个星号(*),且内部使用yield表达式,定义不同的内部状态。 调用Generator函数后,该函数并不执行

a11979的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python generator长度_Python Generator

清单 4. 第三个版本class Fab(object):def __init__(self, max):self.max = maxself.n, self.a, self.b = 0, 0, 1def __iter__(self):return selfdef next(self):if self.n < self.max:r = self.bself.a, self.b = self....

weixin_39618275的博客 688

js中Generator函数详解

如果说 Promise 是为了解决回调地狱的难题出现的,那么 Generator 就是为了解决异步问题而出现的。普通函数,如果调用它会立即执行完毕;Generator 函数,它可以暂停,不一定马上把函数体中的所有代码执行完毕,正是因为有这样的特性,它可以用来解决异步问题。定义一个 Generator 函数,定义的方式和定义一个普通函数是类似的,不同之处在于它在 function 和函数名之间有一个*号。Generator 函数返回是一个迭代器对象,需要通过 xx.next 方法来完成代码执行。

月光晒了很凉快的博客 7013

mybatis generator 修改

修改目标 mybatis配置spring使用时, 原生的generator 不能满足需求 , 生成后需要修改代码, 增加和删除字段会比较烦琐, 因此需要对generator进行修改, 达到一键生成的效果. 去除烦人的注释, 只显示数据库中的注释 Mapper类增加@Mapper注解 实体类继承基类,并且不覆盖基类中的成员(比如id) 实体类增加序列化字段serialVersionUID 下载源...

奋斗 1587

js中generator的详解

对于普通函数而言,它会立即执行,而Generator 函数特性是可以停下,不会立即执行,正是这样的特性,它能很好处理异步问题。定义一个 Generator 函数和定义一个普通函数是类似的,不同之处在于它在 function 和函数名之间有一个*号。Generator 函数返回是一个迭代器对象,需要通过 xxx.next 方法来完成执行。// 定义迭代器对象iterator.next() // 执行这一局代码,1才会被打印。

caixin185的博客 1438

generator 中 调用另一个 generator

(1)for…of循环可以自动遍历 Generator 函数运行时生成的Iterator对象 function doAutomaticTraversal () { let arry = [] function* foo () { yield 1 yield 2 yield 3 yield 4 yield 5 return 6 } fo...

马优晨 517

co与generator

co与generator众所周知,js的的异步操作,基本的是引入回调机制。但是,回调机制容易产生的一个问题是回调金字塔 回调金字塔是js以前编程语法的上的一个诟病,也是异常处理中很麻烦的一件事情。 因此,人们希望能引入一些模式,来用同步编程代替异步编程,ES6之前的promise模式就是如此,而ES6后 ,co与与generator也实现了更简洁,更简单的异步代替同步的逻辑。 generat

zhiweiusetc的专栏 1776

关于mybatis generator生成中文注释

1、创建MyCommentGenerator类实现CommentGenerator接口 package gengrator; import org.mybatis.generator.api.CommentGenerator; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.a...

baidu_41573665的博客 1227
上一篇: 手动模拟实现Map
下一篇: async+await
ccxCode
博客等级 码龄8年 1粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值