Отзыв URL-адреса blob-объекта после его создания в одной строке JavaScript

#javascript #promise #blob #one-liner

#javascript #обещание #большой двоичный объект #однострочный

Вопрос:

Мне просто интересно, как сделать это по-другому. Прямо сейчас я создал единственную строку кода, в которой нет точек с запятой или новых строк. Я хочу прояснить, что в этом нет ошибок вообще. Код создает большой двоичный объект HTML, состоящий из <h1>Example</h1> . Это завернуто в обещание, чтобы я мог получить доступ к результату. Как только я получу результат, я использую amp;amp; оператор, чтобы избежать точек с запятой. URL-адрес большого двоичного объекта открывается немедленно, а затем отзывается через 2000 миллисекунд. Если у вас есть решение, чтобы сделать это короче или сделать по-другому без ; или с новыми строками, пожалуйста, сообщите мне 🙂

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

Я хочу пояснить, что речь идет о синтаксисе.

Редактировать:

Оказывается, благодаря @Bergi это легко возможно с помощью IIFE. Использование IIFE заставляет вас думать в обратном направлении. Я внес некоторые изменения. Эта функция работает следующим образом:

  • Создание URL-адреса большого двоичного объекта HTML для <h1>Example</h1>
  • Он запускает 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'})))
 

Комментарии:

1. Мы здесь не выполняем code-golf, но 2e3 бреем один байт и window. можем быть отброшены

2. На самом деле, почему обещание вообще? Все, пока .then здесь не будет синхронно…

3. И зачем вам нужно, чтобы он был однострочным? Если это не для code-golf, то сделайте его читаемым. Если вас беспокоит размер данных, передайте его в минификатор перед развертыванием.

4. Спасибо, Ps: не однострочный в 131B, который не загрязняет глобальную область: {const u=URL.createObjectURL(new Blob(['<h1>Example</h1>'],{type:'text/html'}));open(u);setTimeout(_=>URL.revokeObjectURL(u),2e3)}

5. @Bergi, я это исправил

Ответ №1:

Нет причин использовать обещание, когда все, что вам нужно, это IIFE для введения переменных:

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

(Извините за читаемое форматирование. Отбрасывайте пробелы по своему усмотрению.)