- 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 загнан в функцию и вызывается два раза, потому что с первого не проходит. А еще в одном блоке токен получается из артибута узла через регулярку...
bormand 17.05.2015 07:12 # +1
А потом заказчику приходит две посылки?
kegdan 17.05.2015 10:08 # +1
Да
stail 17.05.2015 13:17 # +1
inkanus-gray 17.05.2015 17:20 # 0
Stallman 17.05.2015 17:50 # 0
inkanus-gray 17.05.2015 18:01 # +1
Поскольку со второго раза срабатывает, у меня есть подозрения, что авторы перепутали порядок действий. Т. е. если какие-нибудь вызовы поменять местами, то будет срабатывать и с первого.
А вообще здесь ошибка архитектуры. Что-то мне подсказывает, что столько запросов подряд к серверу быть не должно.
Stallman 17.05.2015 18:14 # +1
С архитектурой тут, может, всё очень даже и не плохо - каждый роут работает со строго определенным набором данных. Разве что самопальное недо-RPC попахивает...
inkanus-gray 17.05.2015 18:50 # +1
1. XMLHttpRequest. Требуется коллбек.
2. Формочка с нажатием на кнопку сабмита скриптом. Тут два варианта:
а) Форма в основной странице — всё хорошо, но требуется перезагрузка всей страницы, что в эпоху веб-джва-ноль уже не модно.
б) Форма во фрейме с коллбеком для отслеживания события загрузки. Вероятно, возникнут трудности с получением данных, которые вернёт запрос.
3. WebSocket. Опять пердолинг с коллбеками. Плюс пользователи IE<10 и старых мобильных браузеров соснули.
Способов отправки GET-запроса чуть больше. Достаточно включить в страницу новый элемент (<script>, если нам нужен ответ, или <img>, если ответ не нужен) и снова пердолиться с коллбеками, укалываясь о то, что события загрузки не совсем кроссбраузерные.
Есть как вариант XMLHttpRequest с параметров async=false, тогда можно и без коллбека. Но с ним юзабельна только червона дупа антикварная Опера на Presto. Остальные браузеры во время запроса тупо зависают, а юзер пребывает в панике.
Неужели вменяемого решения для браузерного ЭКМАСкрипта нет?
inkanus-gray 17.05.2015 19:07 # 0
bormand 17.05.2015 19:31 # +1
> браузерного ЭКМАСкрипта
Вопрос риторический?
В общем-то красивый и линейный код будет только с async/await или тредами. Но давать треды веб-мастерам - это как выдать обезьяне ящик с гранатами (в общем-то их им дали в виде web worker'ов, но чеку намертво запаяли).
Впрочем, если совместимость с говном мамонта старыми браузерами не поджимает, для данной задачки можно как раз попробовать web worker и блокирующий XMLHttpRequest.
Stallman 17.05.2015 19:59 # +2
inkanus-gray 17.05.2015 20:02 # +1
Stallman 17.05.2015 20:00 # +1
inkanus-gray 17.05.2015 20:06 # 0
kegdan 17.05.2015 20:13 # 0
stail 17.05.2015 18:19 # +1
>>Но перед выполнением каждой операции нужно убедиться, что предыдущая завершена.
--Как вариант, хотя это и есть правильно.
inkanus-gray 17.05.2015 19:54 # 0
Кроме того, в случае недостижения .success (может быть, сервер вернул другой код ответа) мы не пытаемся повторить запрос и никак не оповещаем клиента, что что-то пошло не так.
В общем, если учесть эти возможности (анализ сообщения об ошибке, когда код ответа 200, и анализ других кодов ответа), то «красивый» каскадный код станет намного сложнее...
bormand 17.05.2015 19:57 # +1
Ну, вроде бы, адекватное API так делать не будет, а кинет подходящий по ситуации код типа 403 или 500.
> никак не оповещаем клиента
А вот это уже плохо.
bormand 17.05.2015 20:01 # 0