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

    +144

    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
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    function order_to() {
        jQuery.ajax({
            type: "POST",
            url: url+'/saveMethod/',
            data: {
                "method": "guest"
            },
            success: function(success) {
                console.log(success);
                jQuery.ajax({
                    type: "POST",
                    url: url+'/saveBilling/',
                    data: {
                        "billing[address_id]": "",
                        "billing[firstname]": "Test",
                        "billing[lastname]": "Query",
                        "billing[company]": "",
                        "billing[email]": "[email protected]",
                        "billing[street][]": "Street",
                        "billing[city]": "City",
                        "billing[region_id]": "",
                        "billing[region]": "",
                        "billing[postcode]": "50",
                        "billing[country_id]": "UA",
                        "billing[telephone]": "+100500",
                        "billing[fax]": "",
                        "billing[customer_password]": "",
                        "billing[confirm_password]": "",
                        "billing[save_in_address_book]": "1",
                        "billing[use_for_shipping]": "1"
                    },
                    success: function(success) {
                        console.log(success);
                        jQuery.ajax({
                            type: "POST",
                            url: url+'/saveShippingMethod/',
                            data: {
                                "shipping_method": "flatrate_flatrate"
                            },
                            success: function(success) {
                                console.log(success);
                                jQuery.ajax({
                                    type: "POST",
                                    url: url+'/savePayment/',
                                    data: {
                                        "payment[method]": "checkmo"
                                    },
                                    success: function(success) {
                                        console.log(success);
                                        var reg = /\/form_key\/(.*?)\/\'\)/;
                                        var raw = jQuery('button.button.btn-cart').attr('onclick');
                                        if (raw == undefined) {
                                            key_form = jQuery('form input[name=form_key]').val();
                                        } else {
                                            var key_form = reg.exec(raw)[1];
                                        };
                                        console.log(key_form);
    
                                        jQuery.ajax({
                                            type: "POST",
                                            url: url+'/saveOrder/form_key/' + key_form + '/',
                                            data: {
                                                "payment[method]": "checkmo"
                                            },
                                            success: function(success) {
                                                console.log(success);
                                            }
                                        });
                                    }
                                });
                            }
                        });
                    }
                });
            }
        });
    }
    order_to();
    order_to();

    Каскадный запрос на jQuery на подтверждение заказа в Magento загнан в функцию и вызывается два раза, потому что с первого не проходит. А еще в одном блоке токен получается из артибута узла через регулярку...

    Запостил: stail, 16 Мая 2015

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

    • А потом заказчику приходит две посылки?
      А потом заказчику приходит две посылки?
      Ответить
    • Сюда тоже нужно вставить ссылку на неудачу с Therac-25.
      Ответить
    • ЭКМАБляди не умеют в последовательное выполнение. Только пердолелизация, только хардкор.
      Ответить
      • Тут последовательное. Но перед выполнением каждой операции нужно убедиться, что предыдущая завершена.

        Поскольку со второго раза срабатывает, у меня есть подозрения, что авторы перепутали порядок действий. Т. е. если какие-нибудь вызовы поменять местами, то будет срабатывать и с первого.

        А вообще здесь ошибка архитектуры. Что-то мне подсказывает, что столько запросов подряд к серверу быть не должно.
        Ответить
        • Угу, и для его реализации пришлось создать всего лишь пять каллбеков. И это нормально?
          С архитектурой тут, может, всё очень даже и не плохо - каждый роут работает со строго определенным набором данных. Разве что самопальное недо-RPC попахивает...
          Ответить
          • Вспомним, какие есть способы отправки POST-запроса из браузера:
            1. XMLHttpRequest. Требуется коллбек.
            2. Формочка с нажатием на кнопку сабмита скриптом. Тут два варианта:
            а) Форма в основной странице — всё хорошо, но требуется перезагрузка всей страницы, что в эпоху веб-джва-ноль уже не модно.
            б) Форма во фрейме с коллбеком для отслеживания события загрузки. Вероятно, возникнут трудности с получением данных, которые вернёт запрос.
            3. WebSocket. Опять пердолинг с коллбеками. Плюс пользователи IE<10 и старых мобильных браузеров соснули.

            Способов отправки GET-запроса чуть больше. Достаточно включить в страницу новый элемент (<script>, если нам нужен ответ, или <img>, если ответ не нужен) и снова пердолиться с коллбеками, укалываясь о то, что события загрузки не совсем кроссбраузерные.

            Есть как вариант XMLHttpRequest с параметров async=false, тогда можно и без коллбека. Но с ним юзабельна только червона дупа антикварная Опера на Presto. Остальные браузеры во время запроса тупо зависают, а юзер пребывает в панике.

            Неужели вменяемого решения для браузерного ЭКМАСкрипта нет?
            Ответить
            • P.S. Вспомнил, что событие загрузки можно ловить без коллбека: тупо в цикле опрашивать состояние, загрузилось или нет.
              Ответить
            • > вменяемого решения
              > браузерного ЭКМАСкрипта
              Вопрос риторический?

              В общем-то красивый и линейный код будет только с async/await или тредами. Но давать треды веб-мастерам - это как выдать обезьяне ящик с гранатами (в общем-то их им дали в виде web worker'ов, но чеку намертво запаяли).

              Впрочем, если совместимость с говном мамонта старыми браузерами не поджимает, для данной задачки можно как раз попробовать web worker и блокирующий XMLHttpRequest.
              Ответить
              • А так обезьяне дали кастрюлю каллбечных макарон, в которых обезьяна все равно умудрилась запутаться так, что до сих пор распутать не могут. Почему-то веб с завидным упорством впитывает в себя самые уёбищные технологии, и что характерно все они в конечном счете становятся мейнстримом. А искусственные ограничения в них породили толпу дегенератов.
                Ответить
                • Но ведь если всё обрабатывать на сервере, а не на клиенте, то всё красиво получается. Осталось только убедить веб-макак, что HTML — это язык разметки гипертекста и ничего более, а перезагрузка страницы после отправки формы — это норма.
                  Ответить
              • С воркерами, тщмт, все равно будет КАЛЛбек, но хотя бы один вместо пяти.
                Ответить
              • А можно сделать что-нибудь красивое на Java/Flash/Silverlight?
                Ответить
                • Ну вообще можно. Правда сильверлайт уже дохнет.
                  Ответить
        • С запросами все норм. В Magento поетапно идет подтверждение.

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

          --Как вариант, хотя это и есть правильно.
          Ответить
          • Кстати, я не подумал о том, что мы каждую следующую операцию выполняем (теоретически) после завершения предыдущей, но не проверяем результат завершения предыдущей операции. Может быть код ответа 200 (тогда сработает коллбек .success), но в ответе будет сообщение об ошибке.

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

            В общем, если учесть эти возможности (анализ сообщения об ошибке, когда код ответа 200, и анализ других кодов ответа), то «красивый» каскадный код станет намного сложнее...
            Ответить
            • > но в ответе будет сообщение об ошибке
              Ну, вроде бы, адекватное API так делать не будет, а кинет подходящий по ситуации код типа 403 или 500.

              > никак не оповещаем клиента
              А вот это уже плохо.
              Ответить
            • Кстати, я для такого случая говнокодил sequence_runner, которому можно передать пачку deferred'ов, которые надо выполнить по порядку. Ну и для красоты он испускал сообщения, которые можно было прицепить к окошку, показывающему прогресс (галочки на успешных, крестики на зафейленных, вертушка на текущем и т.п.).
              Ответить

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