#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'})
))
(Извините за читаемое форматирование. Отбрасывайте пробелы по своему усмотрению.)