1. JavaScript / Говнокод #13871

    +149

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    function refreshPaymentStatus() {
    }
    
    refreshPaymentStatusJob();
    
    function refreshPaymentStatusJob() {
        setInterval("refreshPaymentStatus()", 10000);
    }

    Бесят люди которые, будучи обмануты кажущейся простотой JS, пишут такие конструкции "по привычке". Job он, @#$%, завёл. А Scheduler, интересно, где забыл? А SchedulerManager? А SchedulerManagerFactory? Зато не забыл передать строкой первый аргумент в setInterval, молодец.

    Запостил: madhead, 30 Сентября 2013

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

    • Меня больше прикалывали люди, пишущие в подобном стиле на питоне. Попытки обьяснить, что в js setInterval - асинхронный, т.е. метод будет вызван в том же треде, а в питоне Timer запускает новый тред и что аналогом будет while True: ....; time.sleep(...) успехом не увенчались.
      Ответить
      • Ваш плюс? Рад, что хоть кто-то меня понимает... Я вижу тут негатив не приветствуется. Но просто у меня весь код такой: http://govnokod.ru/12986, http://govnokod.ru/12298 - всё те же люди.
        Ответить
        • Не, я не понял, в чем говнокод и плюс ставил не я. Просто напомнило.
          Ответить
        • Плюс мой. Потому что
          function refreshPaymentStatusJob() {
              setInterval(refreshPaymentStatus, 10000);
          }
          Кстати, я не понимаю, за что ставят минусы...
          Ответить
          • Да вообще без джоба:
            (function refreshPaymentStatus() {
                setInterval(refreshPaymentStatus, 300);
            })();

            А минусы - ожидаемо - пришёл сюда негатив слить, а не позитив привнести...
            Ответить
            • > А минусы - ожидаемо - пришёл сюда негатив слить, а не позитив привнести...
              Мне кажется, минусы тут из-за того, что код не очень смотрится. Или минусующим контекста не хватает, или духа энтерпрайза.
              Вы в этом варитесь и испытываете эмоции, а у просматривающих эмоций не возникает.
              Ответить
              • >или духа энтерпрайза.
                Наверно. Оно нам еще не настолько настопизденело. А вообще, неисповедимы пути кармы.
                Ответить
            • Ну мало ли для чего job может быть нужен... Можно его ещё где-то использовать.
              А твой вариант без job'а неправильный, так каждое выполнение функции будет делать ещё один setInterval.
              Ответить
              • Да, понятно, упустил контекст. Нет, этот джоб точно нигде не юзается. Код служит лишь для периодического обновления инфы на одной из страниц: http://clip2net.com/s/5RdPfg.
                Ответить
                • Контекст тут не при чём. Просто setInterval должен быть вне функции, а не внутри. Ну и не видно причин давать ей имя в таком случае.
                  Ответить
          • Забей и не парься.
            Ответить
      • < Попытки обьяснить, что в js setInterval - асинхронный, т.е. метод будет вызван в том же треде, а в питоне Timer запускает новый тред и что аналогом будет while True: ....; time.sleep(...)>

        Асинхронным будет как раз таки дополнительный поток, дурья твоя бошка!
        Во многих скриптовых языках нет возможности создавать доп.поток, поэтому выкручиваются с помощью таймеров.

        P/S.
        гоатсе постить не буду, просто перечитайте пост еще раз.
        Ответить
        • Ты плохо понимаешь, как работает асинхронный код. Там на самом деле все крутится в одном треде, поэтому ни дай бог его заблокировать.
          Ответить
          • я понимаю. Такая же паибота в autoit-e. Отдельный асинхронный поток средствами самой runtime lib создать нереально, разве что на апях, но все же на моем веку CreateThread на автоите никто не вызывал. Псевдо-многопоточность реализуют иногда через анус:

            AdlibRegister("funcname",interval)
            ,
            где funcname - имя метда, который нужно запускать в отдельном потоке, interval - таймаут, по которому основной (и кстати единственный) поток вызывает указанный метод.
            Ответить
            • Ну вот, а в питоне Timer() запускает функцию в отдельном потоке с определенным периодом, а теперь представь себе, что, внезапно, функция не завершилась к запуску следующей, или еще хуже - если она повисла. Через некоторое время у тебя будет 100500 тредов, да и состояние гонки придется разгребать.
              Ответить
              • Змея укусила свой хвост?

                Все еще хуже, чем я думал.
                Ответить
                • Дело не в змее, дело в том, что люди тащат свои привычки на другой язык, не разбираясь, почему в одном языке сделано так и почему это может не работать в другом языке. Вместо того, чтобы искать "питон setInterval()", нужно отойти на шаг назад, сформулировать, что (а не как) нужно сделать и это искать.
                  Ответить
                  • setTimeout() - ну, в таком случае все верно - выполнять код в отдельном потоке, по таймеру.

                    setTimer(), setInterval(),setTimeout() - выбирай на вкус.
                    Ответить
              • Бля, кажется, в бейсике так же(
                Переполнение ж должно быть по идее?
                Ответить
                • Переполнение чего? Не, ну когда-то они могут и всю память выжрать, если не трогать.
                  Ответить
                  • Бля, ну как-то не по-мужски это.
                    Ответить
                    • Треды, они такие.
                      Ответить
                      • threader красит губы, носит трусики, а в сумочке у него лежит искусственное влагалище. На всякий пожарный.
                        Ответить
                • В дельфях однозначно так. Таймер крутит код в отдельном потоке, проверено на showmessage.
                  Ответить
                  • При открытом ShowMessage показывается еще один? :)

                    Так это нихуя не показатель работы дополнительного потока... Вот таким кодом проверь:
                    procedure TimerTick;
                    begin
                        ShowMessage('Forever alone');
                        repeat until false;
                    end;
                    Если там действительно запускался поток - месседжбоксы показывались бы на каждый тик таймера. Но покажется он ровно 1 раз, после чего все повиснет к хуям. И тогда ты поймешь, что это самая обычная асинхронщина.
                    Ответить
                    • P.S. Ну а для верности выведи результат GetCurrentThreadId() где-нибудь в основном потоке, и по тику таймера. Если покажет разные значения - снимаю шляпу, таймер действительно вызывает обработчик в отдельном потоке ;)
                      Ответить
                      • Прога имеет только 1 поток - я проверял, однако, даже вот такой код:
                        procedure TimerTick;
                        begin
                            ShowMessage('Forever alone');
                            sleep(200000);
                        end;

                        выдает несколько окошек, потом прога подвисает. Если использовать вместо showmessage api messagebox, окошки начинают наслаиваться друг на друга. Их много. Каким образом такое возможно? Я же торможу поток sleep -ом.
                        Ответить
                        • По-братски, скомпилируйте кто-нибудь, у кого есть Делфи.
                          Ответить
                        • > Каким образом такое возможно
                          Внутри showmessage/messagebox вроде бы запускается еще один цикл разгребания сообщений. Видимо он выдергивает следующее событие от таймера из очереди, и исполняет его. А там запускается еще один месседжбокс, внутри которого еще один цикл обработки сообщений и т.п...
                          Ответить
                    • ...
                      Ответить
    • А сколько раз в этом коде встречается вызов этого Джоба?
      Ответить
      • > А сколько раз в этом коде встречается вызов этого Джоба?
        Забавно, если это количество - не константа от времени.
        Ответить
        • Не, не количество вызовов в рантайме, а именно вхождений refreshPaymentStatusJob() в тексте.
          Ответить
          • Один раз. Это весь код, изъято лишь тело функции.
            Ответить
            • Ну тогда да, setInterval(refreshPaymentStatus, 10000) было бы достаточно, безо всяких джобов... Согласен с вами.
              Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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