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

    +156

    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
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    if ($.browser.msie && $.browser.version < 8) {
            $("div.banneritem:gt(0)").remove();
                    $("#viewnow").remove();
                    $("#morerealestates").css("margin-top", "-26px");
                    $("img[align=right]").css("float", "right");
       }
       else {
            setTimeout(function(){
                    slider();
            }, 0);
       }
           
            var got = $("div.banneritem:eq(0)").find("#preview").find("a").attr("href");;
            var timer = 7500;
            var anim = 750;
            function slider()
            {
                    setTimeout(function(){
                            do_slide(0);
                            setTimeout(function(){
                                    do_slide(1);
                                    setTimeout(function(){
                                            do_slide(2);
                                            setTimeout(function(){
                                                    do_slide(2, true);
                                                    setTimeout(function(){
                                                            do_slide(1, true);
                                                            setTimeout(function(){
                                                                    do_slide(0, true);
                                                                    slider();
                                                            }, timer);
                                                    }, timer);
                                            }, timer);
                                    }, timer);
                            }, timer);
                    }, timer);
            }
     
            function do_slide(v,rev)
            {
                    x = "div.banneritem:eq(" + v + ")";
                    if(rev==null)
                    {
                            $(x).slideUp(anim);
                            foo = $("div.banneritem:eq(" + (v+1) + ")").find("#preview").find("a").attr("href");
                    }else
                    {
                            $(x).slideDown(anim);
                            foo = $("div.banneritem:eq(" + (v-1) + ")").find("#preview").find("a").attr("href");
                    }
                   
                    if(foo!=null) got = foo;
                   
            }
           
            $("#viewnow").click(function(){
                    window.location=got;
            });

    Классика, слайдер на 3 елемента, с возавтом ;)

    Запостил: expert, 15 Мая 2014

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

    • > с возавтом
      с чем??
      Ответить
      • С возвратом видимо. Хотя тут скорее подойдет с извратом :)
        Ответить
    • Бля, пять минут фтыкал и пытался найти оператор "was auto".
      Ответить
    • setTimeout(function(){
                              do_slide(0);
                              setTimeout(function(){
                                      do_slide(1);
                                      setTimeout(function(){
                                              do_slide(2);
                                              setTimeout(function(){
                                                      do_slide(2, true);
                                                      setTimeout(function(){
                                                              do_slide(1, true);
                                                              setTimeout(function(){
                                                                      do_slide(0, true);
                                                                      slider();
                                                              }, timer);
                                                      }, timer);
                                              }, timer);
                                      }, timer);
                              }, timer);
                      }, timer);

      А чо.
      Ответить
    • Типичное каллбечное экмаговно.
      Ответить
      • Почему экма? пауза через асинхронность - это браузеры.
        Ответить
        • отсуствутие async/await/yeld from и прочих плюх это jsкал
          Ответить
          • Необходимость в них - это браузер. В отдельном экма можно юзать блокирующий слип.
            Ответить
            • Блокирующий слип в гуи треде это пять. Пользователь разобьет мышку об экран.

              В одном потоке, на евент лупе отлично реализуется кооперативная многозадачность (см asyncio, для примера)
              Ответить
              • ЭКМАПроблемы.
                Ответить
              • > в гуи треде
                Так гуи тред - это браузер. Где гуй в чистом экма?
                Ответить
                • Гуи тред есть везде, где есть гуи. Делать в нем ничего по долгу нельзя, и потому в разных языках есть разного качества решения этой проблемы. В JS нету никакого, потому там делают через таймаут, как во всем мире делали 10 лет назад.

                  Посмотрите как в C# работают с GUI тредом, например.
                  Ответить
                  • Да что тебя на гуи заклинило. Гуи/хуи. Я говорю, что необходимость делать паузы через кооперативную многозадачность - это браузерное. В гуи жавы, awt, кажется, ты можешь блокировать из фоновых потоков что хочешь - отрисовка гуя идет в отдельном потоке.
                    Ответить
                    • Это не только браузерное. Это проблема *любого* GUI.

                      В awt (и в других UI) нельзя рисовать из *соседних* потоков: все равно нужно ставить задачу гуйному потоку.

                      Просто в JVM у тебя есть другие потоки, и потому жить проще. Но ёбля все равно есть. А вот в C# есть async/await, и потому код получается в тысячу раз чище.

                      Безусловно, один тред это проблема браузера.
                      Но отсутствие сахара для асинхронного кодинга -- проблема JS
                      Ответить
                      • А необходимость в асинхронной паузе - это браузеры. Мы по кругу ходим.
                        >Но отсутствие сахара для асинхронного кодинга -- проблема JS
                        Но не ecma. Подавляющее большинство языков его не имеет.
                        Ответить
                        • Именно проблема ecma-262.

                          Такие штуки есть в C#, Python и еще много где.
                          Уж кому-кому а JSу с его лямбдами и соответствующим окружением стыдно такого не иметь.
                          Ответить
                          • Встроенное прямо в язык - только в C#. В питон оно встроено через yield + декораторы.
                            Ответить
                            • да, но в asyncio (а это *стандартная* библиотека!)
                              так красиво работают с yield from, что практически в язык.
                              Ответить
                              • Да нихуя в язык оно не встроено. Сбоку прикручено.
                                Ответить
                                • оно часть стандартной библиотеки, что позволяет нам говорить о *почти-то* встроенности.

                                  Конечно было бы круче всместо yield from иметь настоящий async/await, но все же это наголову лучше лесенок из timeOut которые лечит какой-то неизвестный чел на гитхабе
                                  Ответить
                                  • В синтаксис оно-то не встроено. Алсо, сейчас шкриптобляди начнут кукарекать, что 3.х ненужен, что 2.7 наше все.

                                    Кстати, в фитоне лесенки на один уровень не уберешь.
                                    Ответить
                                    • ну в 2.7 есть всякие макароны типа твистед, но это не многим лучше лесенок.


                                      Просто в JS (как мы видим) глубина лесенки есть функция от количества задач, которые нужно выполнить последовательно.

                                      А в пистоничке это так

                                      @asyncio.coroutine
                                      def test():
                                      yield from create()
                                      yield from write()
                                      yield from close()
                                      # еще 149 задач
                                      yield from asyncio.sleep(2.0)
                                      loop.stop()
                                      Ответить
                                      • Макароны да, это я еще застал, callback/errback, но кажется уже там был декоратор.
                                        Ответить
                                        • Вообще интересно конечно наблюдать как люди пытаются выдумать простой и удобный способ писать асинхронный код.

                                          Пройдет лет десять еще, и каждый язык (ну кроме JS конечно же) будет иметь встроенные средства для асинхронного программирования, как например всякий язык должен иметь идиому для итерации по коллекции (хотя когда-то паттерн итератор был в новинку).
                                          Ответить
                                          • А кому нужна коперативная многозадачность вместо тредов?

                                            - Гуй (тут c#)
                                            - Сервера, ибо проблема c10k (тут языки для веба)

                                            Остальным оно кагбэ не нужно. Асло, нужно асинхронное api - без него от сахара проку 0. Я вот до сих пор не знаю как в питоне асинхронно делать http запросы хоть как-то, а еще лучше с тем же комфортом что в requests. Асинхронный сервер есть - а запросы из него отправлять нельзя, и нахер он нужен?
                                            Ответить
                                            • Приведенные тобою примеры охватывают примерно 89% тех, кому нужен евент луп.

                                              Остальным нужно для чего угодно, что упирается в асинхронный ресурс. А таким ресурсам относятся например стримы (HTTP, файлы и прочая), так что ты прав когда говоришь про HTTP запросы.

                                              Вот тебе пример как это сделали на python, правда жалко что этого пока нет в стандартной либе. Ну впрочем в JS этого тоже нет.

                                              https://pypi.python.org/pypi/aiohttp/0.16.5

                                              response = yield from aiohttp.request('GET', 'http://python.org')
                                              body = yield from response.read()
                                              print(body)

                                              Вообще говоря потоки нужны когда ты хочешь распаралелиться на восемь своих ядер.

                                              Когда у тебя одно ядро, или когда у тебя задача не упирается в CPU (а упирается во внешний аснихронный ресурс типа упомянутых тут стримов) то толку от потоков никакого нет.
                                              Достаточно одного потока с нормальынм асинхронным программированием. Важно просто чтоб проц не простаивал, пока ты ждешь байтиков из внешнего ресурса.
                                              Просто раньше люди не умели такого вот асинхронного программирования, вот и плодили потоки (ну или процессы).

                                              Иными словами треды -- одна из реализаций асинхронного программирования, а евентлуп с кооперативкой -- другая
                                              Ответить
                                              • >Приведенные тобою примеры охватывают примерно 89% тех, кому нужен евент луп.
                                                >Остальным нужно для чего угодно, что упирается в асинхронный ресурс. А таким ресурсам относятся например стримы (HTTP, файлы и прочая), так что ты прав когда говоришь про HTTP запросы.

                                                Но я же это и упомянул.

                                                >Вот тебе пример как это сделали на python,
                                                И там будет в лучшем случае копия urllib? Посимпотичней ничего нет?

                                                >Вообще говоря потоки нужны когда ты хочешь распаралелиться на восемь своих ядер.
                                                Не только. Потоками проще писать. Есть код работающий в одном экземпляре. Нужно запустить n экземпляров параллельно? Не проблема, хуярим n тредов. Подводных камней практически нет, править ничего не надо. Для асинхронного подхода нужно заменить все блокирующие вызовы на асинхронные, отделять долгоиграющие операции итд. Как по мне, многопоточность в 100 раз проще в написании, а нормальные языки без проблем держат до 1000 потоков (языки с gil не в счет, там уже на 60 просадка раза в 2). А асинхронность стоит вводить, когда синхронный подход не срабатывает.
                                                Ответить
                                                • >> И там будет в лучшем случае копия urllib? Посимпотичней ничего нет?

                                                  Ну я же дал ссылку) Там всё сделано совершенно в идеологии asyncio. Пишешь корутину, пихаешь её на евентлуп и наслаждаешься.

                                                  >>Потоками проще писать
                                                  Ну если не нужно синхронизировать их между собой то да, а если нужно? Придется половину кода делать потокобезопасным, критические секции всякие выделять, следить чтоб переменная в кеше не застряла, ловить потом хейзенбаги которые раз в 500 лет случаются.

                                                  А дебажить знаешь как это приятно?

                                                  И кстати не факт что это будет быстрее с таким количеством синхронизации.

                                                  >> нормальные языки без проблем держат до 1000 потоков
                                                  Если речь идет о настоящих потоках (про которые знает ОС, а не про всякие легкие, зеленые итд) то щедулер операционки может и охуеть от переключения контекста. Да и каждый поток все таки тянет за собой структуры в памяти ядра, а она тоже не резиновая.

                                                  >> языки с gil не в счет, там уже на 60 просадка раза в 2
                                                  В языках с gil вообще многопоточность фейковая: потоки могут одновременно читать из внешних ресурсов, а работать одновременно может лишь один поток. Потому в том же пистончике проще наплодить процессов (как это в юниксовом мире часто делали).

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


                                                  PS: время моё кончилось, прощай
                                                  Ответить
                                                  • День гостя закончился?

                                                    aiohttp.request('GET', url)

                                                    А что-нибудь посложнее? get, post с параметрами?

                                                    >Ну если не нужно синхронизировать их между собой то да, а если нужно?
                                                    Выстраивать архитектуру так, чтобы они друг с другом не взаимодействовали. Алсо если у тебя больше 1 потока (тредпул), то тебе и с асинком придется синхронизировать. Судя по твоим рассуждениям эту тему ты толком не знаешь.

                                                    >Если речь идет о настоящих потоках (про которые знает ОС, а не про всякие легкие, зеленые итд) то щедулер операционки может и охуеть от переключения контекста. Да и каждый поток все таки тянет за собой структуры в памяти ядра, а она тоже не резиновая.
                                                    проксичекер стартовал 400 потоков (было видно в таскменеджере), нагрузки не было видно даже на 3м пне.

                                                    >Вообще говоря для той задачи, что ты описал (100500 не связаных между собой заданий , которые нужно параллелить на разные ядра) кошерно использовать заточенные под это языки. Ерланг какой-нибудь.
                                                    Я параллеленье на ядра как раз нигде не упоминал, речь шла про проги которые обычно в простое.
                                                    Ответить
                                                  • Кстати, под этот всратый aiohttp нужен компилятор.
                                                    Ответить
                          • Еще раз. Есть ecma, как я понял, к браузерам вообще никакого отношения не имеющий. Там без асинхронного кода можно обойтись. Есть js, который ecma в браузере - вот ему-то и нужен await. Вот что я хотел скзаать.
                            Ответить
                            • >> как я понял

                              https://en.wikipedia.org/wiki/JavaScript

                              JavaScript (/ˈdʒɑːvɑːˌskrɪpt/; JS), also known as ECMAScript (the untrademarked name used for the standard)
                              Ответить
                              • Хм. Тут ктото, кажется, 1023, рассказывал, что js = ecma + dom.
                                Ответить
                                • DOM не имеет отношения к JS.
                                  Например в node.js DOMа может не быть ввиду отсутствия там HTML, XML и прочих документов.

                                  В современном языке должны быть средства для асинхронного программирования, а в js их нет.
                                  Ответить
                                  • Еще хороший примерно JS без дома это JS под WSH на винде.

                                    До рождения пауершела за милую душу люди писали скрипты на JS под WSH и через COM общались с виндой. Это (за исключением WMIC) было единственным споосбом что-то наскриптовать на винде не ставя всяких перлов
                                    Ответить
                                    • ну раз уж речь зашла о scrpting tencholgies на винде, то помним конечно же ASP classic: там тоже были JS и VBS на сервере, за доооооолго до node;))
                                      Ответить
                        • Вот дружок, смотри как люди пилят костыли ввиду отсутствия в языке подобных конструкций: https://github.com/yortus/asyncawait

                          Хочешь чтобы такое было встроено прямо в язык?
                          А неймспейсы хочешь?
                          А нормальный класс-бейзд ООП?
                          А встроенные в язык загрузчики модулей/классов да еще и с депенденсами транзитивно?
                          Ответить
                          • Я хочу для начала нормальный foreach.
                            Ответить
                            • под ноду есть модуль async

                              items.forEach(function(item){
                              // Call asynchronous function, often a save() to DB
                              item.someAsyncCall();
                              });
                              Ответить
                              • Не асинхронный, самый обычный. Ебать, это самое лучшее из того что есть?
                                Ответить

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