Size: a a a

Clojure — русскоговорящее сообщество

2020 March 20

S

Special K in Clojure — русскоговорящее сообщество
Maxim Penzin
видимо я не очень представляю себе что именно это за хах и где он может применяться в коде на cljs, но я немного в курсе про то, что современная "асинхронность" вджаваскрипте это по сути синтаксический сахар вокруг стейтмашина с промисами, не более.
Промисов в es3 нет
источник

S

Special K in Clojure — русскоговорящее сообщество
Воркеры насколько помню это тоже es6
источник

S

Special K in Clojure — русскоговорящее сообщество
Maxim Penzin
видимо я не очень представляю себе что именно это за хах и где он может применяться в коде на cljs, но я немного в курсе про то, что современная "асинхронность" вджаваскрипте это по сути синтаксический сахар вокруг стейтмашина с промисами, не более.
До прихода промисов обойти синхронность ивентлупа можно было только запихнув операцию в нулевой таймаут
источник

S

Special K in Clojure — русскоговорящее сообщество
Поэтому я подозреваю что после компиляции в cljs все асинхронные операции могут быть выполнены только таким образом
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Special K
До прихода промисов обойти синхронность ивентлупа можно было только запихнув операцию в нулевой таймаут
Которого не существует.
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
То есть поставить 0 можно, получить можно только выполнение когда-то, поближе к "сразу" и зависеть это будет от того, что напихал в текущую очередь движок.
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
И с промисами, насколько я помню, ситуация кардинально не поменялась.
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Хотя, это в ноде промисы отжимались в конец, в браузере чуть лучше.
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
Special K
До прихода промисов обойти синхронность ивентлупа можно было только запихнув операцию в нулевой таймаут
все-таки, не совсем понимаю о чем речь и что именно предполагается обходить. Можно пример кода?

Я знаю случай, когда setTimeout(0) нужен для того, чтобы дать возможность выполниться кода за пределами жс-лупа, например, чтобы браузер что-то у себя поапдейтил. Но cljs тут не при чем.

В нодежс, насколько помню, есть специальный вызов nextTick(), но он как бы ко всяким async/await не очень относится.
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
Oleg Roshchupkin
И с промисами, насколько я помню, ситуация кардинально не поменялась.
вот тоже что-то не помню, чтобы "нативные" промисы были бы чем-то принципиально отличными от других реализаций.
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
Special K
Поэтому я подозреваю что после компиляции в cljs все асинхронные операции могут быть выполнены только таким образом
тут явно какое-то недопонимания того, что значит "асинхронные операции" - то есть если из cljs вызывается какая-то либа, где весь современный джаваскрапт, но никаких проблем.
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
❯ nvm use 10
Now using node v10.6.0 (npm v6.1.0)

❯ node 1.js
timeout1
timeout2
timeout3
timeout4
promise resolve
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
❯ cat 1.js
setTimeout(() => console.log('timeout1'));
setTimeout(() => {
   console.log('timeout2')
   Promise.resolve().then(() => console.log('promise resolve'))
});
setTimeout(() => console.log('timeout3'));
setTimeout(() => console.log('timeout4'));
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
❯ nvm use system
Now using system version of node: v13.11.0 (npm v6.13.7)

❯ node 1.js
timeout1
timeout2
promise resolve
timeout3
timeout4
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Вот последнее — это то, как работает в браузере, если нативное
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Там кроме очереди макротасков есть очередь микротасков
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Которая после выполнения каждого макротаска отрабатывает
источник

S

Special K in Clojure — русскоговорящее сообщество
Maxim Penzin
тут явно какое-то недопонимания того, что значит "асинхронные операции" - то есть если из cljs вызывается какая-то либа, где весь современный джаваскрапт, но никаких проблем.
Если я пишу асинхронный сетевой запрос на самом cljs, то этот запрос же не блокирует основной луп, верно? Как это в итоговом js-коде выглядит?
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
Special K
Если я пишу асинхронный сетевой запрос на самом cljs, то этот запрос же не блокирует основной луп, верно? Как это в итоговом js-коде выглядит?
по завершению запроса там внутри срабатывает колбэк
источник

S

Special K in Clojure — русскоговорящее сообщество
Maxim Penzin
по завершению запроса там внутри срабатывает колбэк
Но пока ответ на запрос не пришёл всё зависает?
источник