Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.05.2012, 00:49
Аватар для cmd
cmd cmd вне форума
Профессор
Отправить личное сообщение для cmd Посмотреть профиль Найти все сообщения от cmd
 
Регистрация: 19.03.2011
Сообщений: 177

Два ajax запроса и callback
Приветы!

В OpenCart товар добавляется в корзину с использованием

$('#button-cart').bind('click', function() {

  $.ajax({
     ... // добавляем товар в корзину
  });

});


Я хочу перед этим запросом добавить ещё один свой. Я знаю, что можно вынести "исходный" запрос в функцию и сделать так:

$('#button-cart').bind('click', function() {

	$.ajax({
		...  // тут мой запрос
		}).done(function( html ) {

		add_product_to_cart(); // callback
			
	});		
});

function add_product_to_cart() {
  $.ajax({
      ... // добавляем товар в корзину
  });
}


Все работает, но мне кажется конструкция громоздкая. Мне кажется, что логичнее было бы вынести в функцию мой запрос, а не "исходный". Подскажите, можно ли реализовать 2 последовательных ajax-запроса более простым способом? Я видел водопад, но мне совсем не охота подключать дополнительные библиотеки (даже маленькие).
__________________
Cogito, ergo sum
Ответить с цитированием
  #2 (permalink)  
Старый 17.05.2012, 16:26
Аватар для keen
Профессор
Отправить личное сообщение для keen Посмотреть профиль Найти все сообщения от keen
 
Регистрация: 28.03.2012
Сообщений: 376

ну по сути всё правильно, я бы только сделал так:
var add_product_to_cart = function () {
  $.ajax({
      ... // добавляем товар в корзину
  });
  ..
};

$.ajax({
	url: '/smth',
	type: 'POST',
	dataType : "json",
	data: {x: 1},
	success: function (json) { 
		..
		add_product_to_cart();		
	},
	...
});
Ответить с цитированием
  #3 (permalink)  
Старый 17.05.2012, 19:08
Аватар для cmd
cmd cmd вне форума
Профессор
Отправить личное сообщение для cmd Посмотреть профиль Найти все сообщения от cmd
 
Регистрация: 19.03.2011
Сообщений: 177

keen, идея в том, что я не хочу исходный код трогать. Или трогать его по-минимуму. Например, такой психодел: перехватить событие $('#button-cart').bind('click', выполнить свой ajax-запрос и в callback имитировать событие $('#button-cart').bind('click'

Нет идей?
__________________
Cogito, ergo sum
Ответить с цитированием
  #4 (permalink)  
Старый 17.05.2012, 19:37
Аватар для keen
Профессор
Отправить личное сообщение для keen Посмотреть профиль Найти все сообщения от keen
 
Регистрация: 28.03.2012
Сообщений: 376

ну сделайте

var func1 = function () { /* ваш первый аякс-запрос */ },
func2 = function () { /* ваш второй аякс-запрос */ };

$('#button-cart').click(func1);
$('#button-cart').click(func2);


при клике сработают оба обработчика. я правильно понял - это то что надо?
Ответить с цитированием
  #5 (permalink)  
Старый 17.05.2012, 21:09
Аватар для cmd
cmd cmd вне форума
Профессор
Отправить личное сообщение для cmd Посмотреть профиль Найти все сообщения от cmd
 
Регистрация: 19.03.2011
Сообщений: 177

keen, нет. В этом примере они сработают одновременно. Нужно, чтобы первый запрос был закончен _до_началча_ выполнения второго. Проще говоря: последовательно.
__________________
Cogito, ergo sum

Последний раз редактировалось cmd, 17.05.2012 в 21:17.
Ответить с цитированием
  #6 (permalink)  
Старый 17.05.2012, 23:03
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от cmd Посмотреть сообщение
keen, нет. В этом примере они сработают одновременно. Нужно, чтобы первый запрос был закончен _до_началча_ выполнения второго. Проще говоря: последовательно.
$.when($.ajax({ /*параметры первого*/})).
    then($.ajax({ /*параметры второго*/}).
        success(function () { 
            /*обработчик успешного завершения второго запроса*/
        })
);

или
$.ajax({ /*параметры первого*/}).
    success(function(){
        $.ajax({ /*параметры второго*/}).
            success(function () { 
                /*обработчик успешного завершения второго запроса*/
            })
    });
Ответить с цитированием
  #7 (permalink)  
Старый 18.05.2012, 00:18
Аватар для cmd
cmd cmd вне форума
Профессор
Отправить личное сообщение для cmd Посмотреть профиль Найти все сообщения от cmd
 
Регистрация: 19.03.2011
Сообщений: 177

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

Мне не нравится то, что мне приходится править исходный код в CMS:
Я не вижу разницы между:
- обрамлять ли исходный ajax-запрос в функцию
- обрамлять ли исходный ajax-запрос в доп. $.ajax
- обрамлять ли исходный ajax-запрос в .done( ... )

Суть одна - внесение изменения в ядро системы. А это не фен-шуй.

Вот представьте, что я написал модуль для CMS. Если для установки нужно добавить в ядро одну строчку, то это уже "не очень хороший" модуль. А если надо изменить работу целого куска код - это откровенно фиговый модуль т.к. он может вступать в конфликты с другими модулями.

Т.е. я хочу защитить пользователей (разработчиков OpenCart, которые будут работать с моим модулем) от говнокода.
__________________
Cogito, ergo sum
Ответить с цитированием
  #8 (permalink)  
Старый 18.05.2012, 02:11
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

Сообщение от cmd Посмотреть сообщение
Мне не нравится то, что мне приходится править исходный код в CMS:
А как вы ещё хотите что-то добавлять?
Сообщение от cmd Посмотреть сообщение
- обрамлять ли исходный ajax-запрос в функцию
- обрамлять ли исходный ajax-запрос в доп. $.ajax
- обрамлять ли исходный ajax-запрос в .done( ... )
я бы написал $.ajax в функции, которую бы потом передал в done в таком виде :
.done( window.mycallback || $.noop );

чтобы ошибка не вылетала, когда window.mycallback неопределен
Сообщение от cmd Посмотреть сообщение
Суть одна - внесение изменения в ядро системы. А это не фен-шуй.
не фен-шуйным было решение разработчиков оставить JS нерасширяемым. из-за этого вы сейчас голову ломаете.
Сообщение от cmd Посмотреть сообщение
Вот представьте, что я написал модуль для CMS. Если для установки нужно добавить в ядро одну строчку, то это уже "не очень хороший" модуль.
хм, обычно эти строчки добавляются не в ядро, а где-нибудь на более высоком уровне.
Сообщение от cmd Посмотреть сообщение
А если надо изменить работу целого куска код - это откровенно фиговый модуль т.к. он может вступать в конфликты с другими модулями.
вот вам и неповоротливость в чистом виде. "деревянный код" встречается повсюду - гибко писать очень трудно (иначе как обьяснить то, что из всех известных расширяемая только jQuery - я про js.. как cms могу привести пример DLE).

Сообщение от cmd Посмотреть сообщение
Т.е. я хочу защитить пользователей (разработчиков OpenCart, которые будут работать с моим модулем) от говнокода.
окей, вы хотите написать код гибко. давайте рассмотрим ситуацию поближе:

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

Демо : jsbin.com/amosuj
// этот код уже был тут
$('#button-cart').bind('click', function() {

  $.ajax({
     ... // добавляем товар в корзину
  });

});
// а теперь - магия.

// объект хуков. на будущее
handlers = {
    start : $.noop,
    end: $.noop
};


// новый обработчик
function newHandler(e, next){ 
    // this будет установлен в элемент, на который установлен обработчик
    // e - объект события
    // next - старый обработчик(функция)

    handlers.start(); // хук начала выполнения новой функции

    // по завершении работ выполнить next и хук окончания выполнения функции
    handlers.end();
    next.call(this, e);
}

var el = $("#button-cart"); // целевой элемент
// старый обработчик. тут можно поимпровизировать, если обработчиков несколько.
var old = el.data("events.click").click[0].handler;

// снимаем все старые обработчики, и цепляем новый, "крутой"
el.unbind("click").bind("click", function(e){
  myNewHandler.call(this, e, old);
});

/*добавить ещё хуков по вкусу*/

Последний раз редактировалось melky, 18.05.2012 в 02:17.
Ответить с цитированием
  #9 (permalink)  
Старый 18.05.2012, 02:36
Аватар для cmd
cmd cmd вне форума
Профессор
Отправить личное сообщение для cmd Посмотреть профиль Найти все сообщения от cmd
 
Регистрация: 19.03.2011
Сообщений: 177

melky, это офигенно красиво! Спасибо за hint. Если у Вас есть персональный сайт - киньте мне ссылку в ЛС и я буду на Вас ссылаться, упоминая такое решение.
__________________
Cogito, ergo sum
Ответить с цитированием
  #10 (permalink)  
Старый 18.05.2012, 02:40
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от cmd Посмотреть сообщение
melky, это офигенно красиво! Спасибо за hint. Если у Вас есть персональный сайт - киньте мне ссылку в ЛС и я буду на Вас ссылаться, упоминая такое решение.
спасибо, сайта нет, ссылайтесь на профиль
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ajax и Json callback функция borabora Prototype & script.aculo.us 0 30.01.2012 15:01
Обработка данных во время AJAX запроса user783 AJAX и COMET 5 09.12.2011 03:24
Как приостановить выполнение скрипта до получения результата AJAX запроса? Хиросим AJAX и COMET 9 31.10.2011 10:56
Проблема с событиями после ajax запроса Mirgorod AJAX и COMET 5 12.06.2010 18:24
Сохранение результата ajax запроса после нажатия 'back' gregOlsen AJAX и COMET 5 18.11.2009 12:23