pezdatskiy
@pezdatskiy
Предприниматель, по выходным- программист

Как прервать уже запущенные ajax запросы?

Добрый день. в составе веб-приложения есть небольшой фреймворк для работы с api.
выглядит примерно так:
function makeRequest(json,action,callback) {
	// Проверка на валидность, если не валиден - пробуем еще раз завернуть в JSON
	if (IsJsonString(json)) {
		json = JSON.stringify(json);
	} 
	if (IsJsonString(json)) { //Если снова не json
		console.log('Error in input-data! Cant make json to send');
		return false;
	} else {
		console.log(json);
		//отправка с указанием версии API и ключом (хранится в сессии)
		$.ajax({
			url: '?page=api.api.splash&v=2.0&apikey='+$('#apikey').attr('key'), // скрипт 
			type: 'POST',
			data: {'json': json
					},
			beforeSend: function() {
				$('#placeholder_for_loadingbar').fadeIn(100); // в этом плэйсхолдере уведомление о действии
			},
			success: function(response) {
					$('#placeholder_for_loadingbar').fadeOut();								
					var data = JSON.parse(response);
					if (data['type'] == 'fault' || !data['type']) {
					console.log('error! '+data['message']);
					return false;
					} else {
						console.log('request success');
						action(data['data']);
						if (callback) {
							callback(data['callback']);
						}
					}
			}
		});
		
	};
	
}


Обратите внимание, Есть некое кастомное действие, которое выполняется при success с передачей туда аргумента в виде параметра

console.log('request success');
(data['data']);

В моем случае это функция поиска проектов по названию
$('.my-selector-input').keyup(function(){
        var data = {'statement':'service','method':'selector','data':{'query':$(this).val(),'table':$(this).attr('table'),'cell':$(this).attr('cell'),'cell_id':$(this).attr('cell_id'),'caller':$(this).attr('id')}};
        makeRequest(data,selectorVariant);
    });

Собственно, функция
function selectorVariant(data) {
    if (data !== 'false' && data && data !== '' && data !== null) {
        var classOf = data[0]['caller']+'-variants';
        $('.'+classOf).remove();
        for (var key in data) {
            $('<span class="btn btn-xs btn-default selector-variants '+classOf+'" item_id="'+data[key]['id']+'" target="'+data[key]['caller']+'" caller="'+data[key]['caller']+'">'+data[key]['title']+'</span>').insertAfter($('#'+data[key]['caller']));
        }
    } else {
         $('.selector-variants').remove();
    }
    
}


Собственно проблема! Существует обработчик онклик
$('.with-selector').on('click','.selector-variants',function(){
       $('#'+$(this).attr('caller')).val($(this).text());
       $('#'+$(this).attr('caller')).addClass('has-success');
       $('.selector-variant-selected-hidden').remove();
       $('<input type="hidden" class="selector-variant-selected-hidden" id="'+$(this).attr('target')+'-caller" name="'+$(this).attr('target')+'-caller" value="'+$(this).attr('item_id')+'">').insertAfter($('#'+$(this).attr('caller')));
       $('.selector-variants').remove();
       $('.unset-disable').removeAttr('disabled');
    });


И надо бы, если этот онклик происходит останавливать все запросы, которые инициированы обработчиком my-selector-input по keyUp (блок выше). Ибо происходит следующее: Таблица в базе большая, запрос возвращается довольно долго, и часто возникает ситуация, когда вариант уже выбран, а запросы продолжают возвращаться, и снова возникают варианты.
Это один из примеров. В целом, хотелось бы понимать каким способом можно прерывать запросы функции, которая вызвана чем то, что не связано с событием, корторое должно их прерывать.
  • Вопрос задан
  • 453 просмотра
Пригласить эксперта
Ответы на вопрос 1
Exploding
@Exploding
wtf?
request = $.ajax(.......);

//и вдруг надумали прервать
request.abort();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 22:26
3500 руб./за проект
22 нояб. 2024, в 21:47
3000 руб./за проект
22 нояб. 2024, в 21:44
50000 руб./за проект