1. Куча / Говнокод #19683

    −2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    // POST /login
    exports.login = function login(req, res) {
        var email = req.body.email;
        var password = req.body.password;
    
        security.rateLimitRequest( 'reset', req, function( err ) {
            if ( err )
                return res.status( 400 ).send( err );
            db.Account.find({email: email, password: password}, function(err, account) {
                if ( err )
                    return res.status( 400 ).send( err );
                account.getAccountStatistics(account, function(err, account) {
                    if ( err )
                        return res.status( 400 ).send( err );
                    account.incrementAccountLoginCount(account, function(err) {
                        if ( err )
                           return res.status( 400 ).send( err );
                        res.send(account);
                    });
                });
            });
        });
    });

    У меня радость во все поля:

    // POST /login
    exports.login = function *login() {
    var email = req.body.email;
    var password = req.body.password;

    try
    {
    // Throws an error if rate limit exceeded
    yield security.rateLimitRequest( 'reset', req );

    // Query MongoDB for account
    var account = yield db.Account.find({email: email, password: password});
    account.statistics = yield account.getAccountStatistics(account);

    // Increment login count
    yield account.incrementAccountLoginCount(account);

    this.body = account;
    }
    catch( err ) {
    // Return the error as JSON
    return res.status( 400 ).send( err );
    }
    });

    Запостил: LispGovno, 23 Марта 2016

    Комментарии (177) RSS

    • Теперь заживем!
      Ответить
    • ES2016? Что новенького, если вкратце? Кто уже поддерживает что-то полезное?
      Ответить
      • Хром и лиса вроде генераторы запилили, а там уж, как видишь, умельцы и до async\await добрались
        Ответить
    • Неужели в жс больше не будет лапши
      Ответить
      • Будет. Есть тысячи неосиляторов отладки этой питушни, пока это реализовано на уровне библиотеки
        Ответить
      • не будет

        Лет через семь-десять, когда все верстуны научаться
        Ответить
    • yield же давно вроде бы был.
      Ответить
      • yield был давно в JavaScript (Firefox), но в ECMAScript не было.
        В ff несколько лет назад были и генераторы, и аргументы по умолчанию, и много прочей питушни.
        Ответить
    • Как гэта хуйня работает? Что значит звездочка?
      Ответить
      • > Что значит звездочка?
        Генератор. А работает так же как и асинхронка на генераторах в питоне.
        Ответить
        • А в каком месте генератор становится асинхронным кодом? В питоне приходилось лепить декораторы.
          Ответить
          • В хохлятских универах не учат стейт машинам?
            Ответить
          • Генератор позволяет запустить кусок кода "параллельно" и хранить стейт. Он yield'ит некоторое условие, которого хочет дождаться. А планировщик из либы просто дёргает эти генераторы, когда условие выполнилось. Вот тебе и простейшая асинхронка.
            Ответить
            • Да-да, вот где указано, что генераторы надо юзать как асинхронный код?

              Если кто не понял о чем я - в питоне надо было для этого перед функцией указать специальный декоратор.
              Ответить
              • показать все, что скрытогосподи, какая же у тебя каша в голове

                как сложно наверное с тобой разговаривать, ты же слова не по назначению используешь

                что такое " генераторы надо юзать как асинхронный код"?
                Как можно вообще конструкцию языка юзать как код?
                И декоратор не делает никого асинхронным. Если ты о корутинах, то это понятие конкретной библиотеки
                Ответить
              • показать все, что скрытоДык, получается, декоратор там просто для защиты от дурака был?
                Ответить
                • Ты меня не понимаешь.
                  Ответить
                  • заплачь, дай ему пощечину и вернись жить к маме
                    Ответить
                  • Ну так объясни получше. А то я, дурак, думаю, что всё определяется контекстом использования генератора, а не какими-то маркерами на нём. Генератор - всего лишь стейтмашинка, у которой можно дёргать next/send, чтобы она сменила свой стейт и выдала какой-то результат.

                    Захотел сделать из него асинхронные корутины - сделал (см. код ниже). Захотел просто поюзать в фориче - поюзал. Но я, видимо, дурак, сишкоблядь, и не понимаю ДАО питона...
                    Ответить
                    • Надо как-то указать, что yeild надо понимать как await. Вот это и делает декоратор. Обеспечивает переключение контекста после yield.

                      Ты наверно не понимаешь как в питоне работают декораторы.
                      Ответить
                      • показать все, что скрытоВ моём коде ниже я что-то указывал, чтобы yield понимался как await? Но контекст, тем не менее, переключается. В чём ты можешь убедиться по логу.

                        > Ты наверно не понимаешь как в питоне работают декораторы.
                        Я прекрасно понимаю, как они работают.
                        Ответить
                        • показать все, что скрыто>Надо как-то указать, что yeild надо понимать как await.
                          Т.е. это должна делать вызывающая сторона. Да, контеткстом использования. Где здесь этот контекст?
                          Ответить
                          • АП
                            Ответить
                            • Я не понял, что ты хотел сказать. Ну ок, попробую ответить как понял.

                              Контекст использования в том моём коде - как аргумент функции Spawn() и как заyield'енное значение из генератора, который передали в Spawn(). Вот в этом контексте генератор используется как coroutine.

                              Или ты про контекст, который переключается? Тот контекст хранится внутри генератора в виде описанных в нём переменных (вспомним, что генератор - нихуя не функция, а объект-стейтмашинка). У каждого инстанса генератора - свой.
                              Ответить
                              • Что-то должно использовать генератор как сопрограмму. В этом гк этого кода нет.
                                Ответить
                                • Ты про гк из топика?
                                  Ответить
                                  • ДА!
                                    Ответить
                                    • Ну ты же не видишь использования функции генератора из топика. Его либо через yield вернут из другого генератора, либо в какую-нибудь хуйню типа моего Spawn()'а передадут.
                                      Ответить
                                      • Это действительно твой код, или спиздел где?

                                        Б-Л-Я-Д-Ь, я и спрашиваю, блядь - где код который из генераторов делает асинхронный код?
                                        Ответить
                                        • > Это действительно твой код
                                          Ты про портянку на ideone, которую я кидал? Да, мой.

                                          > из генераторов делает асинхронный код
                                          Нету там такого кода. Есть код, который асинхронно по ивентам (т.к. код упрощён - только по таймеру) пинает генераторы, создавая иллюзию, что они исполняются параллельно друг с другом :)
                                          Ответить
                                          • Ладно, заеб.

                                            С каких пор ты на 3 питоне? И что за heapq?
                                            Ответить
                                            • > С каких пор ты на 3 питоне
                                              С тех пор, как не надо питонить в продакшен.

                                              > heapq
                                              Куча, структура данных такая (heap). Конкретно здесь юзается как приоритетная очередь, чтобы ближайший таймер искать.
                                              Ответить
                                              • показать все, что скрытодаже в 15й убунте уже питон3 по умолчанию
                                                и почти во всех репах он есть
                                                даже в сраных редхатообразных в EPEL есть
                                                Ответить
                                                • И даже если нет - его можно поставить. Я в курсе, гость.
                                                  Ответить
                                                  • показать все, что скрытода, из сырца типа собрать
                                                    Ответить
                                                    • Собрал как-то, как на офсайте советовали. Потом пип ставил модули не в тот каталог откуда их читал питон или еще какая-то хуйня приключилась. Прыщештабильность, че.
                                                      Ответить
                                                      • показать все, что скрытоСтабильность это использовать менеджер пакетов из дистрибутива. А если ты собираешь руками, то нужно указывать пути в --configure.

                                                        поди-ка мне под винду поставь пистона с mod_wsgi, apache, и всеми нужными либами типа libssl32.
                                                        Ответить
                                                        • Постой, но надо мне было поставить питон - я и прочитал инструкцию на сайте. А так я уже не помню, почему не заюзал apt. По-моему, последней версии 2.х там не было.

                                                          А что до винды - это проблемы прыщеговна.
                                                          Ответить
                                                          • показать все, что скрытоНа свете существует более шести сотен линуксов
                                                            Они все делятся на deb-based, rpm-based, а еще есть gentoo и arch.

                                                            Ты реально хочешь чтобы для всех шести сотен на сайте было написано как это ставить?

                                                            "Последней двойки" могло не быть в твоей репе, а не в aptе.
                                                            Апт это клиент репы. Найди правильную репу и все.

                                                            И причем тут прыщеговно? Ты пистон прыщеговном назвал?
                                                            Ну давай тогда, поставь мне пред-последний MS-SQL на Windows-7 и последнюю студию. А потом удали случайно .msiку из c:\windows\Installer и попробуй обновиться на последний SQL.

                                                            Поразгребаешь бесконечные "unknown error" с вот такими вот логами: https://justpaste.it/ovlj
                                                            А потом расскажешь мне про прыщи
                                                            Ответить
                                                            • Я в душе неебу что у тебя за проблемы с вендой, я даже не исключаю, что есть вендоговно. Но питон - абсолютно однозначно прыщеговно. С какой-нибудь жавой даже близко нет такого количества проблем на винде, особенно если сравнить с прыщами.

                                                              По крайней мере, в винде софт ставится по принципу "скачай экзешник - запусти", это может осилить любой школьник. А тут, видите ли, я что-то не так поставил.
                                                              Ответить
                                                              • показать все, что скрыто>>Я в душе неебу что у тебя за проблемы с вендой
                                                                очевидно ничего сложнее контр-страйка ты никогда не ставил

                                                                Знаешь как напрмиер .net подключить к IIS на Win2003?

                                                                >> С какой-нибудь жавой даже близко нет такого количества проблем на винде
                                                                особенно когда там ставится JDK и JRE, и в итоге у тебя две разных java.exe и две разных хранилки ключей и сертификатов. В итоге люди едят говно когда не понимают почему у них HTTPS не работает например

                                                                >>"скачай экзешник - запусти"
                                                                ты в винде не силен, видать
                                                                во-первых давно уже крупные пакеты используют MSI
                                                                Во-вторых если ты будешь ставить тот же MS-SQL, то узнаешь что там есть prerequrements, и вот там тебя могут попросить и .net обновить и CRT поставить (а CRT бывают разные, от разных студий, и не дай бог тебе поставить бету! Потом нихуя ее не удалишь нормально и не обновишь)

                                                                И наконец в десятке есть уже OneGet.

                                                                А вот на линуксе как раз все просто: сами качаются депенденсы.
                                                                Даже школьник справится.
                                                                Ответить
                                                                • Профессиональным вендоблядством я не занимался, но блядь есть же инсталлятор для того же питона на венде.

                                                                  >особенно когда там ставится JDK и JRE, и в итоге у тебя две разных java.exe и две разных хранилки ключей и сертификатов. В итоге люди едят говно когда не понимают почему у них HTTPS не работает например
                                                                  Но запускается только та что в path? Алсо какое это отношение имеет к пользователям?

                                                                  Про msi в курсе, чем он отличается от exe с точки зрения пользователя?

                                                                  OneGet это что?

                                                                  >А вот на линуксе
                                                                  Ты про apt-get? Ну нету там нужной мне версии, а дальше что? Хуяк-хуяк, pip не работает, начинаем ебсти себе мозги?
                                                                  Ответить
                                                                  • показать все, что скрыто>>Профессиональным вендоблядством я не занимался

                                                                    Понятно. Винду ты не знаешь, линукс ты не умеешь. Чтож ты умеешь тогда?

                                                                    >>Но запускается только та что в path?
                                                                    Да, но keystorage у них разное.

                                                                    >> Алсо какое это отношение имеет к пользователям?
                                                                    Никакой. А вот к программистам на жабе -- очень даже.

                                                                    >>OneGet это что?
                                                                    Это попытка сделать обертку вокруг chokolatey и других пакетных менеджеров для венды на пауершелле. Гугл в помощь тебе

                                                                    >>Ты про apt-get? Ну нету там нужной мне версии, а дальше что?
                                                                    Значит пошел в /etc/apt/sources.list.d и добавил репу с нужной версией
                                                                    Ответить
                                                                    • Что значит "не знаю"? Как пользователь я ее знаю, админством не занимался.

                                                                      >Да, но keystorage у них разное.
                                                                      Как возникла проблема? Запускаться будет постоянно одна и та же жава.

                                                                      Программисты свои проблемы как-нибудь решат. Я, например, удалял лишние jre которые тащила с собой жава (кстати, нахера?). Реальные проблемы возникают, когда у пользователей автоматом не ставятся нужные модули. Не будешь же им объяснять, как пользоваться пипом?

                                                                      На винде есть пакетные менеджеры? И как оно?

                                                                      >Значит пошел в /etc/apt/sources.list.d и добавил репу с нужной версией
                                                                      Если ты такой умный, чего строем не ходишь? Я как малоопытный пользователь поставил из исходников - и получил проблему. А на винде бы такого не было.
                                                                      Ответить
                                                                    • > Значит пошел в /etc/apt/sources.list.d и добавил репу с нужной версией
                                                                      И через месяц огреб при обновлении оси, тк добавил не официальные репы.
                                                                      Ответить
                                                                      • Я здесь еще напомню, как поставил transmission на нас по инструкции, добавив репозиторий. Потом решил поставить питон, появился конфликт, я от безысходности нажал "разрешить", обновилась libc и я остался без наса на пару месяцев.
                                                                        Ответить
                                                            • > А потом удали случайно .msiку из c:\windows\Installer и попробуй обновиться на последний SQL.
                                                              А потом совершенно случайно отформатируй винт и попробуй обновиться на последний SQL.
                                                              Ответить
                                                              • Кстати, а какого хрена всякое говно вроде винды и жавы хранит msi где-то на системном разделе? У меня ssd с хронической нехваткой места, дороговато, блядь, на нем всякую срань хранить.
                                                                Ответить
                                                                • а где им их хранить? Винда должна каким-то магическим образом понять что нужно хранить на другом диске?
                                                                  Есть один способ научить ее: перенести папку и сделать hard link.

                                                                  но ты видимо и в винде нуль, как и в линухе
                                                                  Ответить
                                                              • ой, не пизди дурак
                                                                MSIки удаляются при очистке диска

                                                                Да и без удаления попробуй обновить бету студии на новую, ггг
                                                                Ответить
                                            • Исполняемый код имхо желательно держать в конце (у тебя создается объект сразу после объявления)
                                              Ответить
                                        • > из генераторов делает асинхронный код
                                          Ну или можешь им считать Spawn(), который возвращает объект, который дёрнет коллбек, когда генератор бросит StopIteration.
                                          Ответить
                      • Могу тебе объяснить как, пидор.
                        Ответить
                • Да
                  Ответить
                  • Надо такой на гк повесить чтобы гости хуйню не писали.
                    Ответить
              • декоратор в питоне одно, а конструкция языка - более общее понятие. Так вот то, что ты называешь декоратором - не он
                Ответить
          • >>А в каком месте генератор становится асинхронным кодом?
            ой мама родная

            поди почитай про yield from и asyncio
            Ответить
          • http://ideone.com/0pVEwD

            Или этот код недостаточно асинхронен?

            З.Ы. Не обращай внимания на луп и его остановку. В боевом сервере там бы сокеты опрашивались и т.п. Здесь он просто для примера.
            Ответить
            • показать все, что скрытоТеперь тебе еще придется объяснять ему про event loop и кооперативную многозадачность на одном потоке
              Ответить
              • Да как всегда окажется, что у нас с ним разные понятия об асинхронности кода.
                Ответить
                • Наверняка он путает многопточный код, параллельный и асинхронный

                  Все путают
                  Ответить
                  • >> многопточный код

                    Чет мне кажется многопоточное, все-таки, программирование, ну, или программа

                    Параллельный - код

                    А асинхронный - вызов метода (ну или функции, набора инструкций, не суть)
                    Ответить
                    • показать все, что скрытоДа, так лучше, ты прав.

                      Многопоточное -- использующее более одного потока исполнения (довольно тонкая грань между многопроцессным, особенно на linux)

                      Параллельный (конкурентный) -- выполняющийся параллельно (строго говоря может быть и на другой машине)

                      Асинхронный -- неблокирующий вызов с колбеком (может быть на другом треде)

                      Фишка в том, что для того чтобы асинхронно вызывать метод или иметь параллельные вычисления, вовсе не обязательно возиться с многопоточностью

                      Потоки всего лишь одна из реализаций
                      Ответить
                      • показать все, что скрыто> Параллельный (конкурентный)
                        >> Все путают

                        Включая тебя, Гость. Погугли concurrency vs parallelism.
                        Ответить
                        • показать все, что скрытоничего что слово "concurrent" переводится как "параллельный"?
                          Ответить
                          • > ничего что слово "concurrent" переводится как "параллельный"?

                            "А ни чего, что у меня парень работает в Майкрасофт и на него молятся пол Украины Ит-шников?" (c)

                            Гость, я тебя вычислил. Это ты переводишь книжки по IT гуглотранслейтом, превращая их в нечитаемое говно.
                            Ответить
                            • Гость владелец издательства "Питер" ?
                              Ответить
                              • > Гость владелец издательства "Питер" ?

                                Почему сразу владелец? Переводчиком скорее подрабатывает.
                                Ответить
                            • Скорее, работает ализаром на кабре.
                              Ответить
                              • показать все, что скрыто> ализаром
                                Кто это?
                                Ответить
                                • Ньюфаг?
                                  Ответить
                                  • Ну типа. Я на хабр хожу только если мне кто-то ссылку кинет...
                                    Ответить
                                    • Где новости читаешь?
                                      Ответить
                                      • В аське (да, во вконтакт я хожу раз в квартал, скайп запускаю только если попросят, а ватсапов и прочих хуиберов у меня нет)...
                                        Ответить
                                        • Штоблядь? Новости? В аське?

                                          Аську надо дропать. У меня контакт пропал, потребовало типа прикрепления телефона к уину для того чтобы ему писать (баг какой-то)
                                          Ответить
                                          • > Новости? В аське?
                                            Да, использую друзей как фильтр новостей :)

                                            З.Ы. Ну а если ты про политические новости - на 99% от тебя на ГК...
                                            Ответить
                                            • Нет, про it. А что ты делаешь когда не хочешь их читать?
                                              Ответить
                                              • > когда не хочешь их читать
                                                Не читаю, лол. Логи же всегда остаются, если вдруг всё-таки захочется прочесть.
                                                Ответить
                                                • У друзей отдельные акки с которых они пишут новости? Иначе как ты отделяешь новости от остального?
                                                  Ответить
                                                  • > как ты отделяешь новости от остального
                                                    У меня там не такой поток, чтобы отделять было мучительным и долгим занятием... Ну и ссылки всякие на фоне других сообщений видно же.
                                                    Ответить
                                  • Знаешь кто такой доктор лайт?
                                    Ответить
                            • Я не знаю, Ром, кто твой парень, и вообще не понимаю причем тут твоя личная жизнь.

                              Но это слово действительно так переводится.
                              От того что какой-то анонимный пидар на стековерфлоу придумал свою классификацию, из которой следует что задачи пеерсекающиеся и не пересекающиеся по времени относятся к разным типам, вовсе не значит что перевод поменялся

                              ну хотя может быть для тебя с твоим парнем анонимные пидары на SO и авторитеты, не знаю
                              Ответить
              • Я знаю, что такое кооперативная многозадачность.
                Ответить
    • Если они уже начали пиздить фичи из питона, то лет еще через 5 может появиться нормальный await
      Ответить
    • Алсо, шкриптоблядки. Напишите-ка мне без await такую хрень:
      for (i=0; i<n; i++) {
          doSomething(i);
          sleep(time);
      }
      Ответить
      • Написал:
        for (i=0; i<n; i++) {
            doSomething(i);
            sleep(time);
        }
        Ответить
        • В браузере, мудень. Там sleep нету, а есть setTimeout()
          Ответить
      • for (i=0; i<n; i++) {
            doSomething(i);
            WScript.Sleep(time);
        }

        #WSH #JScript #ВыбериЯзыкПодЗадачу
        Ответить
      • var sleep = require('sleep').sleep;
        
        for (i=0; i<n; i++) {
            doSomething(i);
            sleep(time);
        }

        Один мужик прикрутил сишный слип как модуль к ноде.
        npm install sleep
        Ответить
        • показать все, что скрытоОткуда ты знаешь что это мужик?
          Ответить
        • показать все, что скрытоА теперь представь как этот мужик заменит sleep() на system("rm -rf")
          Ответить
          • Я после недавних новостей боюсь использовать модули node.js
            Ответить
            • Так их же можно один раз скачать (при желании - даже скомпилировать вручную, если нативный питух есть) и использовать всегда.
              Ответить
            • показать все, что скрыто>open-source
              >боюсь использовать

              Это ж не хром, не скайп и не прочая мелкопитушня с шифрованным автообновлением.
              Ответить
              • >open-source
                >боюсь использовать
                >хром

                Алсо у меня замечательно был случай, когда установленный модуль обновил одну библиотеку, которая оказалась нерабочей, после чего у меня в момент отвалились все проги юзавшие эту библиотеку. Старую версию я не помнил.
                Ответить
                • Уж сколько раз твердили миру о вреде перманентного автоапдейта.

                  Работает? Не трогай.
                  Полез? Не жалуйся.

                  >хром
                  Его упомянул как монструозную софтину на миллиарды строк, которые никто не осилит прочитать. В отличие от небольших npm модулей.
                  https://bugs.chromium.org/p/chromium/issues/detail?id=500922

                  К тому же хром=опесорцный хромиум+фирменные проприетарные фичи.

                  Так вот. Одной из таких фич является бэкграунд процесс Google Update. А так же отправка гуглу шифрованной питушни о твоем компе со свалки. И еще дырявый флеш.

                  Google Chrome != open source

                  Ответить
                  • Куда, блядь, полез? Ты читать умеешь? Я модуль поставил, он сам зависимость обновил. Не подскажешь как это поведение изменить?

                    >И еще дырявый флеш.
                    Пиздец интересно слышать это от вендобляди.
                    Ответить
                    • показать все, что скрыто>Не подскажешь как это поведение изменить?

                      Кончено подскажу. Для начала попробуй перестать пить мочу.

                      >Пиздец интересно слышать это от вендобляди.
                      3_14dar, ты аутотренингом решил чтоле заняться, срамной нищеброд гы-гы-гы :))
                      Уже весь ГК заполонило твоё неосиляторство.
                      Ответить
                      • Что ты несешь, петух блядь? Флеш в хроме такой же как в любом другом браузере.

                        И неосилятор здесь ты.
                        Ответить
                        • показать все, что скрыто3_14dar здесь только ты :)

                          Пидарок, не гори так, ггг. А то будет как прошлой весной. Ты тогда по ходу не один стул сжёг.
                          Ответить
                          • Питушилка, ну расскажи мне, как сделать, чтобы модули не обновляли зависимости, и насколько популярно такое действие среди питонистов.
                            Ответить
                            • >и насколько популярно такое действие среди питонистов.

                              >ну расскажи мне, как сделать, чтобы модули не обновляли зависимости

                              Простая пошаговая инструкция, специально для тебя:
                              1. Используй менеджеры пакетов/зависимостей
                              2. Перестань пить мочу
                              3. Напитон, 3_14dar, напитон
                              Ответить
                        • > Флеш в хроме такой же как в любом другом браузере.

                          Нет. Флеша существует аж три штуки:

                          1. Модуль для ActiveX. Используется в Интернет Эксплорере.

                          2. Модуль для NPAPI. Используется в браузерах.

                          3. Модуль для PPAPI. Используется в Хроме.

                          Это не просто интерфейсы. Реально устанавливается три разных плеера.
                          Ответить
          • Обидно будет.
            Кстати, мужики могут в самой ноде все функции на system("rm -rf") заменить.
            Или в обновлении ОС такое придёт.
            Или какую-нибудь питушню забабахают, чтоб вентиляторы в случайное время отключились.
            Так что мир обречён. И деньги фиатные.
            Ответить
            • > Или какую-нибудь питушню забабахают, чтоб вентиляторы в случайное время отключились.

              Нвидиа впереди планеты всей.
              Ответить
      • показать все, что скрытоhttp://ideone.com/0pVEwD

        См. функцию foo(). В этом коде её запустили 2 раза в параллельных "потоках". И без единого await'а (yield же не считается за await?).
        Ответить
        • На жс в браузере, блядь. Я думал из темы гк будет понятно.
          Ответить
          • Сам не можешь этот код с пистона мысленно портануть? Ну ок, ок, сейчас портанём...
            Ответить
            • > без await
              И без эмуляции через генераторы. Валяй.
              Ответить
              • > И без эмуляции через генераторы.
                Тогда никак. Если не юзать генераторы (или их эмуляцию через препроцессинг типа Babel'а), то никак. Хуярь лапшу.
                Ответить
                • Ну чисто ради интереса - может хоть как-то можно?
                  Ответить
                  • Ну были бы макросы и свич как в сишке - можно было бы накостылить...

                    А так, если в языке нету способа описать конечный автомат, выглядящий как функция (аля yield или async/await) - никак.
                    Ответить
                  • Ну есть страшный способ - получить исходник функции (жс, емнип, позволяет), построить AST и собрать на его основе конечный автомат (или лапшу из коллбеков), по смыслу похожий на функцию.
                    Ответить
                    • показать все, что скрытоА с каких пор генератор = конечный автомат, а не машина тьюринга?
                      Ответить
                      • > машина тьюринга
                        Да, походу ты прав.
                        Ответить
                      • Ну если занудствовать, то стоит вспомнить, что реальный компьютер конечен и полноценной машиной Тьюринга быть не может.
                        Ответить
                        • Упоминая абстрактные автоматы, имеют в виду, что устройство/алгоритм может то же самое, что они. Короче, хз как тут правильно ответить, кто поможет?
                          Ответить
                        • ну-ка опеределение МТ в студию
                          Ответить
          • > На жс в браузере, блядь
            Так бы сразу и писал.

            function sleep(time) {
                var timer = Date.now();
                while(Date.now() - timer < time);
            }
            function doSomething(i) {
                console.log('kokoko', i);
            }
            for (i=0; i<5; i++) {
                doSomething(i);
                sleep(1000);
            }


            сейчас напишет ещё чтобы проц не нагружало
            Ответить
            • while(Date.now() - timer < time);

              Нахуй иди с таким кодом

              >сейчас напишет ещё чтобы проц не нагружало
              Нет. Просто нахуй.

              Алсо что будет если заблокировать поток в js в браузере? Что зависнет - одна вкладка, или весь брауер?
              Ответить
              • В нормальных браузерах — вкладка и браузер предложит убить скрипт. ИЕ не пользуюсь.
                Ответить
                • На хабре писали недавно, как можно заблокировать внутри встроенной функции, тогда виснет целиком браузер.
                  Ответить
                  • показать все, что скрытоЭто в каких браузерах работает? В хромобраузерах по процессу на несколько вкладок же.
                    Ответить
                    • > В хромобраузерах по процессу на несколько вкладок же.
                      Кстати, если плохая сеть, то тормозят они все вместе (блокируются в ожидании чуда).
                      Ответить
                      • Кто они? Вкладки сидящие на одном процессе? Но не весь браузер же?
                        Ответить
                        • показать все, что скрытоТочно не известно. Выглядело как зависание всего браузера (может, только какой-нибудь главный процесс).
                          Если при зависании скрипта можно переключить вкладку, то тут хром просто не реагировал, пока сеть не стабилизировалась или не отключалась до конца.
                          Ответить
              • показать все, что скрытоНет блять, я этот код реально буду использовать, прикинь.

                Ты что шутки от серьёзных вещей не можешь отличить?
                Ответить
      • Ну предположим можно сделать setTimeout() на себя, а дальше надо как-то хранить состояние.
        Ответить
      • Ну конкретно этот пример можно сделать. Тут результаты doSomething не юзаются, можно просто запихать все блокирующие действия в очередь, вернуть управление, да разгребать очередь какой-нибудь хернёй с setTimeout.
        for (i=0; i<n; i++) {
            if (doSomething(i))
                break;
            sleep(time);
        }
        Вот такой пример надо. Тут результат юзается, очередью уже не выкрутишься.
        Ответить
        • > конкретно этот пример можно сделать

          Мне одному кажется, что конкретно этот пример реализуется тривиально?
          (function doAndWait(i, n) {
              if (i == n) return;
              doSomething(i);
              setTimeout(function () { doAndWait(i + 1, n); }, time);
          })(0, n);
          Ответить
          • > этот пример реализуется тривиально
            Ну блин. Этот пример тут просто для простоты. Не писать же тут какую-нибудь бизнес логику с десятком запросов в теле, как в топике.

            Понятно, что всё это можно руками превратить в херню-с-коллбеками... Но ведь "блокирующий" код с async/await пишется и ревьювится намного проще...

            З.Ы. Часто и комбинаторов хватает типа sequential(), parallel() и т.п. Но не всегда.
            Ответить
          • Я это выше написал. Но если нужно любое хранение состояния, то приходится выкручиваться, читаемость тоже падает.
            Ответить
            • Поскольку в пиздожс нет биндинга, придется в качестве параметра прокидывать self.
              Ответить
              • Емнип, там есть bind().
                Ответить
                • Тогда все проще - делаем аналог итератора, в конце next() делаем таймаут на себя же.
                  Ответить
        • > Вот такой пример надо.

          Адаптировал код под твой пример:
          (function doAndWait(i, n) {
              if (i == n || !doSomething(i)) return;
              setTimeout(function () { doAndWait(i + 1, n); }, time);
          })(0, n);
          Ответить
      • показать все, что скрытоЭто не полностью выдуманный пример, примерно так выглядят какие-то пошаговые эффекты.
        Ответить
        • Ну задачка, где тебе надо последовательно что-то сделать (и последовательность не зависит от результата самих действий, как максимум - просто прерывается при фейле одного из них), она намного проще, чем общий случай.

          Как я выше писал - "блокирующие" функции просто ставят свою побочку в очередь, которая разгребается по setTimeout или коллбекам о завершении.
          Ответить
          • Ну пусть хотя бы это напишут, без велосипедных копипастных хелперов.
            Ответить
            • показать все, что скрытоА нафиг теперь, когда в браузеры уже вот-вот завезут генераторы, а для текущих версий есть транслятор всех новых фишечек жс в говнокод (babel)?
              Ответить
              • Чтобы ткнуть отсталых жсблядей рылом в их говно? Это нормальным людям было всегда понятно, что без foreach и асинхронного кода в браузере не жить.
                Ответить
    • Полностью от лапши не избавились же - все равно код не плоский.
      Ответить
      • показать все, что скрытоhttps://hacks.mozilla.org/2016/01/web-push-arrives-in-firefox-44/

        Да вы заебали. Ну сколько можно
        async function registerForPush() {
          // Register the Service Worker
          let registration = await navigator.serviceWorker.register('service-worker.js');
          
          // Check if we already have a subscription
          let subscription = await registration.pushManager.getSubscription();
          
          // If not, try to subscribe.
          if (!subscription) {
            subscription = await registration.pushManager.subscribe();
          }
          
          // Save the subscription data on our website's backend.  
          await fetch('/save-push-endpoint', {
            method: 'post',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(subscription)
          });
          
          // Done! Now our backend can send Push messages by POSTing to subscription.endpoint!
        }
        Note: This code sample uses ES7’s draft async/await syntax, since it reads most clearly. To use this in production, check out the equivalent in plain JavaScript.
        Ответить
        • >: This code sample uses ES7’s draft async/await syntax, since it reads most clearly. To use this in production, check out the equivalent in plain JavaScript.
          Ответить
    • vanished
      Ответить

    Добавить комментарий