【问题标题】:Revoking blob URL after Creating it in a single line JavaScript在单行 JavaScript 中创建后撤销 blob URL
【发布时间】: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,有点让你倒退。我做了一些编辑。此功能的工作原理:

  • &lt;h1&gt;Example&lt;/h1&gt; 创建一个 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(['&lt;h1&gt;Example&lt;/h1&gt;'],{type:'text/html'}));open(u);setTimeout(_=&gt;URL.revokeObjectURL(u),2e3)}
  • @Bergi,我修好了

标签: javascript promise blob one-liner


【解决方案1】:

当您只需要 IIFE to introduce variables 时,没有理由使用承诺:

(u => (
  window.open(u),
  setTimeout(_ =>
    URL.revokeObjectURL(u))
  , 2000)
))(URL.createObjectURL(
  new Blob(['<h1>Example</h1>'],{type:'text/html'})
))

(对不起,可读的格式。删除你认为合适的空格。)

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2016-09-11
    • 2022-11-21
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多