Avatar for 9000

[#nargery] В конторе мне сейчас досталось много писать на ES6 / Node. А там promises. Немедленно пригодились знания о монадках и их законах (для promise под определённым углом работают все, с одной выколотой точкой). Немедленно в коде возникли currying и point-free style, просто потому, что это понятнее и короче. Немедленно await воспринимается как `<-` внутри хаскелевской do-notation.

Comment

Самое приятное, что promises пошли в мэйнстрим, и все библиотеки либо выставляют их напрямую, либо обладают обёртками для преобразования интерфейса. Глядишь, и разумные паттерны в сообществе постепенно закрепятся.

 ‎· 9000
Comment

закрепятся паттерны "хуй подебажишь". Они, собственно, уже закрепились - makeFuture().then().then().then().then().then().thenError().then().thenError(). угадайте, как выглядит стек, если ты поймал SIGSEGV в четвёртом .then()

 ‎· кружок татарских лайфхаков 15
Comment

Нуу, не знаю; либо вставлять debug print, либо node inspect -p <pid> мне помогают в тяжёлых случаях. Хочешь красивый stacktrace — не ленись давать функциям имена. А sigsegv — это, я так понимаю, собственно node рухнула, native code; когда такое бывает?

 ‎· 9000
Comment

да тут и без sigsegv, просто где-то в event loop что-то упало, что читало из сокета. из какого сокета, что читало...

 ‎· misha 1
Comment

и эти люди упрекают Яверов за длинный stack trace

 ‎· Glory to Mankind
Comment

Ну что кроме лени мешает в промисы контекст добавить и его логгировать. Или правильно пробрасывать ошибки по цепочке промисов вверх.

 ‎· TODO: feathers 2
Comment

@walkin: длинный стектрейс хорошо, короткий плохо!

 ‎· стреляй по часам!
Comment

Смотреть на сетевые ошибки в стектрейсах это вообще какой-то дурной вкус. Их обрабатывать надо, это ж не исключительная ситуация, а норма жизни.

 ‎· TODO: feathers 3
Comment

@earwin: обязательно расскажу об этом людям, написавшим мой проект, если увижу когда-нибудь

 ‎· misha 3
Comment

^^^^ "пробрасывать ошибки по цепочке промисов вверх" — именно.

 ‎· 9000 1
Comment

@9000 любой код - нативный. Но конкретно вот тот - это плюсы. И про "давать функциям имена" в этом контексте отдельно хорошо - потому что лямбды, лямбды везде. Их даже folly::Symbolizer не берёт. Дебаг принты вставлять да, но прошлый раз, когда мне пришлось нырять в это говно, принтов получилось 150(СТО ПЯТЬДЕСЯТ), и в конце это были принты стектрейсов. Потому что стеки у тебя "Executor вызывает .then()". В лучшем случае. А в худшем (который собственно и был) стектрейса нет, потому что кто-то закинул worker loop в IOThreadPoolExecutor, и у тебя 2% этих вот .then() просто никогда не исполняются. Они помещаются в очередь палача (можно я буду Executor переводить как "палач"?) и там сидят.

 ‎· кружок татарских лайфхаков 2
Comment

@dma: "любой код - нативный" ^ vs "ES6 / Node" из поста слегка противоречат друг другу. А так да, вещь относительно новая ⇒ относительно сырая, не обросшая ещё удобствами везде.

 ‎· 9000 1
Comment

Вот сейчас к нам пришёл чувак, очень умный и толковый, но он про свойства монад не в курсе, поэтому возня с promises и async functions, и особенно их смесью, даётся ему медленно и нелегко. То, что для меня очевидно и автоматически, для него требует длинного сознательного усилия.

 ‎· 9000
Comment

я когда-то давно, когда открыл для себя multithreading - немедленно стал порождать треды на каждый чих, потом огорчился когда увидел уровень оверхеда и перестал. эрланг на тот момент как-то прошел мимо меня. а теперь наконец-то всем этим можно пользоваться! (в некотором смысле промис - тот же тред)

 ‎· MI5 ELI5
Comment

@oleksandr_now: Не, promise ≠ thread, и порождать их надо не на каждый чих, а там, где API напрямую этого требует. Вообще, конечно, мне ещё сильно помогает то, что условные 25 лет назад я писал GUI-программы для Windows 3.1. Там та же система событий и concurrency в одной нитке, очередь сообщений и callbacks по их приходу, что и в ноде, и в реакте, только удобств вокруг неё сильно меньше. Могла бы и macos classic быть, там так же идейно. (Эрланг да, actor systems великая вещь.)

 ‎· 9000 1

1 2 3 4 5 6 7 8 9 10