- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 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 загнан в функцию и вызывается два раза, потому что с первого не проходит. А еще в одном блоке токен получается из артибута узла через регулярку...
        
        
А потом заказчику приходит две посылки?
Да
Поскольку со второго раза срабатывает, у меня есть подозрения, что авторы перепутали порядок действий. Т. е. если какие-нибудь вызовы поменять местами, то будет срабатывать и с первого.
А вообще здесь ошибка архитектуры. Что-то мне подсказывает, что столько запросов подряд к серверу быть не должно.
С архитектурой тут, может, всё очень даже и не плохо - каждый роут работает со строго определенным набором данных. Разве что самопальное недо-RPC попахивает...
1. XMLHttpRequest. Требуется коллбек.
2. Формочка с нажатием на кнопку сабмита скриптом. Тут два варианта:
а) Форма в основной странице — всё хорошо, но требуется перезагрузка всей страницы, что в эпоху веб-джва-ноль уже не модно.
б) Форма во фрейме с коллбеком для отслеживания события загрузки. Вероятно, возникнут трудности с получением данных, которые вернёт запрос.
3. WebSocket. Опять пердолинг с коллбеками. Плюс пользователи IE<10 и старых мобильных браузеров соснули.
Способов отправки GET-запроса чуть больше. Достаточно включить в страницу новый элемент (<script>, если нам нужен ответ, или <img>, если ответ не нужен) и снова пердолиться с коллбеками, укалываясь о то, что события загрузки не совсем кроссбраузерные.
Есть как вариант XMLHttpRequest с параметров async=false, тогда можно и без коллбека. Но с ним юзабельна только червона дупа антикварная Опера на Presto. Остальные браузеры во время запроса тупо зависают, а юзер пребывает в панике.
Неужели вменяемого решения для браузерного ЭКМАСкрипта нет?
> браузерного ЭКМАСкрипта
Вопрос риторический?
В общем-то красивый и линейный код будет только с async/await или тредами. Но давать треды веб-мастерам - это как выдать обезьяне ящик с гранатами (в общем-то их им дали в виде web worker'ов, но чеку намертво запаяли).
Впрочем, если совместимость с говном мамонта старыми браузерами не поджимает, для данной задачки можно как раз попробовать web worker и блокирующий XMLHttpRequest.
>>Но перед выполнением каждой операции нужно убедиться, что предыдущая завершена.
--Как вариант, хотя это и есть правильно.
Кроме того, в случае недостижения .success (может быть, сервер вернул другой код ответа) мы не пытаемся повторить запрос и никак не оповещаем клиента, что что-то пошло не так.
В общем, если учесть эти возможности (анализ сообщения об ошибке, когда код ответа 200, и анализ других кодов ответа), то «красивый» каскадный код станет намного сложнее...
Ну, вроде бы, адекватное API так делать не будет, а кинет подходящий по ситуации код типа 403 или 500.
> никак не оповещаем клиента
А вот это уже плохо.