草庐IT

javascript - 等效于 ES6 生成器的 Function.prototype.apply

coder 2024-12-26 原文

我正在尝试构建可链接的 JavaScript API。 (我在启用了迭代器和生成器的最新版本的 V8 中运行它。)在下面的示例中,setState 是可链接的。它还允许您调用它而无需显式创建新的 Builder 实例。 chain() 辅助函数处理并自动返回该实例,因此 setState 不必担心它。 (一流的功能为赢!)

除了可链接的方法之外,我还需要一些“终止”方法。更重要的是,这些“终结者”是发电机。生成器生成 Builder 实例的内部状态。问题是我无法找出与生成器的 f.apply(that, arguments) 等效的方法。我希望能够在运行时调用生成器并设置其 this 上下文,就像您可以使用 Function.prototype.applyFunction .prototype.call.

变通方法,用 Yuck! 评论,是在 Builder.prototype 上公开委托(delegate)的 原始生成器,从委托(delegate)调用原件。有没有什么方法可以像 chain 方法一样实现等效的包装,而不必在 Builder.prototype 上公开 _generate 方法?

function Builder() { this.initialState = 'initialState'; };
Builder.prototype.setState = chain(function(k, v) { this[k] = v; });
Builder.prototype.generate = delegate(generate, '_generate'); // Yuck!
Builder.prototype._generate = generate;


function chain(f) {
  return function() {
    var that = (this instanceof Builder) ? this : new Builder();
    f.apply(that, arguments); // Pass through arguments
    return that;
  }
}

function delegate(gen, _gen) {
  return function*() {
    var that = (this instanceof Builder) ? this : new Builder();
    that.setState('delegated', true);               
    yield *that[_gen](); // Yuck!
  }
}

function *generate(opts) {
  var i = 0;
  for(var i = 0; i < 10; i++) {
    yield [Object.keys(this), opts, i].join(',');
  }
}

// Set up a namespace
var ns = {};
ns.setState = Builder.prototype.setState;
ns.generate = Builder.prototype.generate;


var itr = ns
//  .setState('a', 'A')
//  .setState('b', 'B')
//  .setState('c', 'C')
  .generate('options');


var out = [];
for(var value of itr) { out.push(value); }
out;

哪个返回

[
  "initialState,delegated,,0",
  "initialState,delegated,,1",
  "initialState,delegated,,2",
  "initialState,delegated,,3",
  "initialState,delegated,,4",
  "initialState,delegated,,5",
  "initialState,delegated,,6",
  "initialState,delegated,,7",
  "initialState,delegated,,8",
  "initialState,delegated,,9"
]

最佳答案

The problem is that I can’t figure out an equivalent to f.apply(that, arguments) for a generator.

ES6 draft来看,您不需要等效项 - 您可以按原样使用表达式。生成器函数(构造生成器实例)是函数,它们从 Function.prototype 继承(通过 Generator.prototype);您可以像在任何其他函数上一样对它们使用 .call.apply

所以以下应该有效:

function delegate(gen) {
  return function() {
    var that = (this instanceof Builder) ? this : new Builder();
    that.setState('delegated', true);               
    return gen.apply(that, arguments); // Pass through arguments
  }
}

关于javascript - 等效于 ES6 生成器的 Function.prototype.apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27411262/

有关javascript - 等效于 ES6 生成器的 Function.prototype.apply的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  3. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  4. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  5. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  6. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  7. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  8. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  9. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  10. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

随机推荐