利用ES6 的generators 化异步为同步

浅谈ES6中的generator生成器(异步回调可变为同步代码) 首先是官网的介绍: generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。 generator和函数不同的是,generator由function*定 义(注意多出的*号),并且,除了return语句,还可以用yield返回多次。 官网地址.基础用法讲解 异步的产生: ,因为项目中用的vue的,写法: * B() { yield getSupplierList().then(() => { console 阅读详情

generator可以将异步转化为同步,让JS中讨厌的回调清晰起来。

如下例:

var fs = require('fs')

function run(generator){

  console.log('now in run')

  var it = generator(go)

  console.log(`now get it : ${it}`)

  function go(err,result){
    console.log(`now in go, err is 
      ${err},result is 
      ${result}`)

    var next = it.next(result)

    console.log(`now after it.next and its value and done : ${next.value},${next.done}`)
  }

  go()

  console.log(`end of function run`)

}

run(function* (done){

  console.log(`before var exercises`)

  var exercises = yield fs.readFile('gulp.js',done)

  console.log(`exercises is ${exercises}`)

})

在console台的结果是这样:

now in run
now get it : [object Generator]
now in go, err is 
      undefined,result is 
      undefined
before var exercises
now after it.next and its value and done : undefined,false
end of function run
now in go, err is 
      null,result is 
      var gulp= require('gulp');
var htmlmin=require('html-minifier');

gulp.task('minifyhtml',function(){

    gulp.src('myjq.html')
    .pipe(htmlmin({collapseWhitespace:true}))
    .pipe(gulo.dest('./dist'))
})
exercises is var gulp= require('gulp');
var htmlmin=require('html-minifier');

gulp.task('minifyhtml',function(){

    gulp.src('myjq.html')
    .pipe(htmlmin({collapseWhitespace:true}))
    .pipe(gulo.dest('./dist'))
})
now after it.next and its value and done : undefined,true

关键就在这个run函数,执行流程是这样的:

  1. 新建一个generator-iterator对象(it)
  2. 定义go函数,在go函数中调用了it.next
  3. 将go函数传给了genterator-iterator对象作为回调
  4. 不带参数地运行go函数一次,来初始化generator

go函数总共被执行了两次,一次不带参数,第二次拿到了yield fs的结果再做下面的事情。

还可以把fs.readFile包装成另一个函数,再看

function run(taskdef){

  let task = taskdef()

  let next = task.next()

  console.log(`刚进run函数 next,${next.value}`)

  function step(){

    console.log('in step')

    if(!next.done){

      if(typeof next.value === 'function'){

        console.log(`type func`,next.value)

        next.value( function(err,data){

          if(err){

            console.error('err happend', err)

            task.throw(err)

            return
          }

          console.log('data happed',data)

          next = task.next(data)

          console.log(`next= task.next(data),${next.value},${next.done}`)

          step()


        })
      }

      else{ // else 部分始终没有执行到

        console.log(`now value not func, ${next.value}`)

        next = task.next(  next.value )

        console.log(`in else module , nextvalue = ${next.value}`)

        step()

      }
    }

  }


  step()

}

let fs = require('fs')

function readFile(filename){

  return function(callback){

    fs.readFile(filename,callback)
  }

}

run(function* (){

  let contents = yield readFile('gulp.js')

  console.log(`contents happed ,${contents}`)

  console.log('done')
})

console台的结果是:

刚进run函数 next,function (callback){

    fs.readFile(filename,callback)
  }
in step
type func function (callback){

    fs.readFile(filename,callback)
  }
data happed <Buffer 76 61 72 20 67 75 6c 70 3d 20 72 65 71 75 69 72 65 28 27 67 75 6c 70 27 29 3b 0a 76 61 72 20 68 74 6d 6c 6d 69 6e 3d 72 65 71 75 69 72 65 28 27 68 74 ... >
contents happed ,var gulp= require('gulp');
var htmlmin=require('html-minifier');

gulp.task('minifyhtml',function(){

    gulp.src('myjq.html')
    .pipe(htmlmin({collapseWhitespace:true}))
    .pipe(gulo.dest('./dist'))
})
done
next= task.next(data),undefined,true
in step

这块不是很好理解,建议自己敲一遍代码试试。

然后它还可以结合promise来用,总之感觉还是蛮赞的~

python入门:Anaconda和Jupyter notebook的安装与使用 一、安装和使用Anaconda 1、anaconda是什么? Anaconda在英文中是“巨蟒”的意思,与python的意思相近,它是python的包管理器和环境管理器。 2、为什么需要安装anaconda? 原因有以下几点: 附带一大批常用的数据科学包,方便立即开始处理数据 管理包 anaconda是在conda(一个包管理器和环境管理器)上发展来的;而conda可以很方便地对第三方的包进行安装、卸载和更新。 管理环境 conda可以为不同的项目建立不同的运行环境,避免不同的项目或包版本 阅读详情

相关推荐

Flightmare实战:从零搭建强化学习无人机控制环境

本文详细介绍了从零开始搭建Flightmare强化学习无人机控制环境的完整流程。内容包括环境准备、核心库安装、依赖冲突解决,以及如何运行PPO算法示例进行训练与可视化测试。文章还提供了环境配置、自定义任务修改及常见问题的避坑指南,帮助开发者快速上手这一模块化的无人机RL仿真平台。

weixin_29081101的博客 356

js异步成同步

这里写目录标题题目解答Callback(回调函数)PromiseGeneratorasync js异步成同步有4种方法:Callback/Promise/Generator/async,下面我以题目为例子演示这四种方法。 题目 现有打印红色、绿色和黄色三个函数,要求等待三秒后打印一次红色,然后等待2秒后打印一次绿色,接着等待一秒后再打印一次黄色;按此规律不断循环打印红绿黄。 // 亮灯函数如下: function red(){ console.log(‘red’); } function gree

kjprime的博客 1万+

Linux 音频驱动(六) ALSA音频驱动之PCM Write数据传递过程

目录1. 前言2. PCM Data Flow3. 总结 1. 前言 本文,我们将以回放(Playback,播放音频)为例,讲解PCM Data是如何从用户空间到内核空间,最后传递到Codec。 在Linux 音频驱动(一) ASoC音频框架简介中,我们给出了回放(Playback)PCM数据流示意图: 对于Linux来说,由于分为 user space 和kernel space,而且两者之间不能随便互相访问。因此用户如果播放音频,则需要调用copy_from_user()将用户数据从user spa

_Modest_的博客 1万+

es6里面解决异步的方法

Generator函数:Generator函数是ES6中引入的一种新的函数类型,它可以用来生成迭代器。async/await:async/await是一种基于Promise的语法糖,它使得异步代码看起来像同步代码,更易读、易写、易调试。Promise:Promise是一种用于处理异步操作的对象,它可以表示一个异步操作的最终完成或失败,并返回结果值或错误原因。回调函数:回调函数是一种常见的异步编程方式,在ES6之前就已经存在了。它通过将一个函数作为另一个函数的参数来实现异步操作。

T3165919332的博客 511

k3s cpu load 和 cpu 使用率很高处理

在这期间还执行过缩减 sqlite3 数据库操作,不知道是哪个操作起了作用,亦或者两个操作有影响,删除 ns 促进了数据库缩减的执行(没删除之前数据库缩减不成功,db文件大小未减小,但不确定是不是执行完 VACUUM 之后需要时间 db 文件才会减小,或者是因为删除了 ns 才导致其减小),再或者是两个操作都起了作用。kubectl get ns 发现有很多卡在删除状态的 ns。k3s 官网关于这个问题的谈论。执行如下脚本删除掉这些 ns。有人详细说过这个问题。

weixin_40548182的博客 682

31、工程中不确定性量化与优化的全面解析

本文全面解析了工程中不确定性量化与优化的关键方法。针对数据充足与不足两种情况,分别介绍了概率理论和非概率方法在不确定性建模中的应用;系统阐述了采样方法、FORM/SORM、泰勒级数近似等不确定性传播技术;深入比较了RBDO与RDO两种主流优化框架的原理、步骤及适用场景,并通过两杆桁架案例展示了具体实现过程。文章旨在为工程师提供一套完整的从不确定性分析到优化设计的方法论,提升工程系统的可靠性与稳健性。

php55的博客 121

React-ES6 Promise的用法,async/await异步处理同步化

Promise

qk 965

利用GAT(图论分析工具箱)构建并分析大脑结构协变网络学习笔记

前言 前面我学习了利用DTI构建白质纤维脑网络,并采用GRETNA计算了小世界网络属性。阅读文献发现可以利用灰质体积或皮层指标(皮层厚度、折叠指数、沟深)等构建结构协变网络再进行网络拓扑属性的计算。因此,我采用前面提取的灰质体积和皮质数据进行了结构协变网络分析,特此写下笔记以便后面的学习。 一、数据准备 二、构建结构协变网络 三、全局属性的统计分析 四、局部属性的统计分析 五、网络攻击分析 六、度的分布 ..................

weixin_52073820的博客 7496

ES6之Generator 函数

15 Generator 函数 15.1 简介 15.1.1 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。本章详细介绍 Generator 函数的语法和 API ,它的异步编程应用请 看《异步操作》一章。 Generator 函数有多种理解角度。从语法上,首先可以把它理解成, Generator 函数是一个状态机,封装了多个内部状态。...

low666的博客 620

windows下宝塔安装教程

windows下宝塔安装教程 目录宝塔是什么?宝塔安装流程1.下载2.配置3.登录4.安装的环境套件小结 宝塔是什么? 宝塔是管理服务器的免费的软件,宝塔上面可以进行对你的服务器批量进行管理,对于运维人员来说还是必不可少的一个软件,值得使用。 宝塔安装流程 1.下载 链接: https://download.bt.cn/win/panel/BtSoft.zip 下载后安装买最好自定义目录,方便找 2.配置 下载完成后会出现这个页面,对着页面进行配置 点击默认密码复制进来,这里注意一点就是一定要查看

你在看屏幕的同时,屏幕也在注视着你 4421

【无人机路径规划】基于强化学习实现多无人机路径规划附matlab代码

1 简介 本文提出一种基于强化学习实现多无人机路径规划。​ 2 部分代码 % This is used to measure the path length, service rate and risk explosure for each UAVs %% parameters function [PL,ServiceRate,Risk]=measure global N2; % divide [0,1]*[0,1] map into N2*N2 grid when calcul

qq_59747472的博客 6901

ES6 Generators的异步应用

  ES6 Generators系列: ES6 Generators基本概念 深入研究ES6 Generators ES6 Generators的异步应用 ES6 Generators并发   通过前面两篇文章,我们已经对ES6 generators有了一些初步的了解,是时候来看看如何在实际应用中发挥它的作用了。   Generators最主要的特点就是单线程执行,同...

ddjq1044的博客 173

FPGA实现PCIe接口

PCI Express(PCIe)是一种高速串行计算机扩展总线标准,在FPGA中实现PCIe接口可以实现与主机系统的高速数据通信。以下是FPGA实现PCIe接口的关键技术要点。

whm128的博客 1458

ES6 Generators并发

  ES6 Generators系列: ES6 Generators基本概念 深入研究ES6 Generators ES6 Generators的异步应用 ES6 Generators并发   如果你已经读过这个系列的前三篇文章,那么你肯定对ES6 generators非常了解了。希望你能从中有所收获并让generator发挥它真正的作用。最后我们要探讨的这个主题可能会...

ddjq1044的博客 201

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

learn-generators 指南:掌握 JavaScript ES6 生成器

learn-generators 指南:掌握 JavaScript ES6 生成器 项目介绍 learn-generators 是一个专为学习 JavaScript ES6(也称为 ES2015)中的生成器设计的交互式工作坊。该仓库由 Ruslan Ismagilov 主导,并得到了众多贡献者的支持,旨在通过一系列自我引导的工作坊帮助开发者深入理解并熟练运用生成器功能。此项目适合那些希望在异步编程...

gitblog_00567的博客 1108

android 蓝牙通讯demo

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

深入研究ES6 Generators

  ES6 Generators系列: ES6 Generators基本概念 深入研究ES6 Generators ES6 Generators的异步应用 ES6 Generators并发   如果你...

weixin_39037804的博客 119

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ES6 Generators基本概念

ES6 Generators系列: ES6 Generators基本概念 深入研究ES6 Generators ES6 Generators的异步应用 ES6 Generators并发   在JavaScript ES6提供的诸多令人兴奋的新特性中,有一个新函数类型,叫generator。名字听起来很怪(我们姑且将它称之为生成器函数),而且行为更加让人觉得怪异。本文旨在解释generat

阿贵的博客 382

ES6中的异步编程:Generators函数+Promise:最强大的异步处理方式

访问原文地址 generators主要作用就是提供了一种,单线程的,很像同步方法的编程风格,方便你把异步实现的那些细节藏在别处。这让我们可以用一种很自然的方式书写我们代码中的流程和状态逻辑,不再需要去遵循那些奇怪的异步编程风格。 换句话说,通过将我们generator逻辑中的一些值的运算操作和和异步处理(使用generators的迭代器i...

weixin_33743703的博客 226

ES6异步方案——生成器Generators/yield

一、Generator函数简介   generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。   ES6定义generator标准时借鉴了Python的generator的概念和语法。 1、理解Generator函数   Generator函数有多种理解角度。 function* gen() { yield 1; y...

hqs2212586的专栏 508

异步发展流程 —— Generators + co 让异步更优雅

原文出自:https://www.pandashen.com Generators 简介 Generator 函数是 ES6 提供的一种异步编程解决方案,是一个生成器,用于生成一个遍历器的函数,语法行为与传统函数完全不同。 Iterator 遍历器 JavaScript 原有的表示 “集合” 的数据结构,主要有 Array 和 Object,在 ES6 中又加入了 Set 和 Map,这样...

github_38140984的博客 298

【ES6】Generators的原理

https://davidwalsh.name/es6-generators 在ES6中最有趣的特点之一就是一个崭新的方法类型,叫做generator(发电机?)。这个名字有点儿奇怪,但是乍看之下,它的操作可能会非常陌生。本文的目的一是为了解释它运作的原理,二是帮助读者建立理解为什么他们对JS的未来有很强的作用力。 相关link https://link.zhihu.co

哇咔咔 797

深入理解ES6 Generators

“深入理解ES6”是一个针对第6版ECMAScript(简称ES6)标准的新特性的系列教程。非常高兴能发布今天的内容。今天我们叫讨论ES6中最“奇妙”的特性。为什么说“奇妙”呢?首先,这个特性与已存在于JS中的其他特性相比有较大的不同,尤其在刚开始接触时有些晦涩难懂。换句话说,它彻底颠覆了JS的正常行为。如果这还不算“奇妙”,那我不知道什么才算是了。不仅如此:这个特性简化了代码,并且修正了“回调地狱

lm278858445的专栏 1457
上一篇: 弹出弹窗后,如何禁止底层的body滚动,适用于超长的页面
下一篇: 理解ES6 (1) var, let, const 之间的区别 (2) 字符串和正则表达式
十方魔
博客等级 码龄10年 202粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值