【发布时间】:2021-01-04 05:50:07
【问题描述】:
我只是好奇如何以不同的方式做到这一点。现在,我创建了一行代码,其中包含 NO 分号或换行符。我想明确一点,这根本没有任何错误。该代码创建了一个由<h1>Example</h1> 组成的HTML blob。这包含在一个承诺中,因此我可以访问结果。得到结果后,我使用 && 运算符来避免使用分号。 blob url 立即打开,然后在 2000 毫秒后撤销。如果您有解决方案来缩短此时间或在没有; 或新行的情况下以不同方式完成,请通知我:)
new Promise(r=>r(URL.createObjectURL(new Blob(['<h1>Example</h1>'],{type:'text/html'})))).then(u=>{window.open(u)&&setTimeout(t=>URL.revokeObjectURL(u)),2000})
我想明确一点,这是关于语法的。
编辑:
事实证明,多亏了@Bergi,这很容易通过 IIFE 实现。使用 IIFE,有点让你倒退。我做了一些编辑。此功能的工作原理:
- 为
<h1>Example</h1>创建一个 HTML Blob URL - 它通过一个做两件事的 IIFE 运行 URL
- 打开网址
- 为要加载的窗口设置事件监听器,然后撤销 URL
((u,e=open(u))=>e.onload=_=>URL.revokeObjectURL(u))(URL.createObjectURL(new Blob(['<h1>Example</h1>'],{type:'text/html'})))
编辑(不需要e):
(u=>open(u).onload=_=>URL.revokeObjectURL(u))(URL.createObjectURL(new Blob(['<h1>Example</h1>'],{type:'text/html'})))
【问题讨论】:
-
这里我们不做code-golf,但是
2e3会减少一个字节,window.可以丢弃 -
实际上为什么要使用 Promise?直到这里的
.then之前的所有内容都是同步的... -
为什么你需要它成为一个单线?如果它不是用于代码高尔夫,那么请使其具有可读性。如果您担心数据大小,请在部署前将其传递给 minifier。
-
谢谢,Ps:131B 中不污染全局范围的非单行:
{const u=URL.createObjectURL(new Blob(['<h1>Example</h1>'],{type:'text/html'}));open(u);setTimeout(_=>URL.revokeObjectURL(u),2e3)} -
@Bergi,我修好了
标签: javascript promise blob one-liner