jQuery - как да не се връща от функция, докато не приключи ajax request?

Torbalan Trolski

Well-Known Member
Код:
function importManufacturer( actionUrl, manufacturer, manufacturerData ) {
	....
	$.ajax(ajaxOptions);
}

	$.when( $.ajax(ajaxOptions) )
		.then(
			function( data, textStatus, jqXHR ) {				
				data = JSON.parse(jqXHR.responseText);	
				
				for( key in data ) {
					// console.log( key );
					importManufacturer( actionUrl, key, data[key] );
					
				}
			}
		);
Въпроса е как да си седя във функцията, докато не се изпълни ajax-а вътре в нея.
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Нещо не те разбирам, но погледни тука:
http://api.jquery.com/Ajax_Events/
И пробвай с success и complete.
Или обясни по-като за бавнозагряващи.
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Здравей,
може да сложиш безкраен цикъл в тялото на главната функцията, който да излиза при някакъв флаг, но като цяло такава концепция е не правилна. Идеята на AJAX-а е да е асинхронен, няма защо да "запушваш" браузъра докато се изпълнява самата функция.
Какво искаш да постигнеш, може да има по-добър вариант.
Поздрави.
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Нещо не те разбирам, но погледни тука:
http://api.jquery.com/Ajax_Events/
И пробвай с success и complete.
Или обясни по-като за бавнозагряващи.
Бях скапан снощи като го писах. Ползвам всичките евенти включая и beforesend. Не ми върши работа.

Здравей,
може да сложиш безкраен цикъл в тялото на главната функцията, който да излиза при някакъв флаг, но като цяло такава концепция е не правилна. Идеята на AJAX-а е да е асинхронен, няма защо да "запушваш" браузъра докато се изпълнява самата функция.
Какво искаш да постигнеш, може да има по-добър вариант.
Поздрави.
Това, че е асинхрнонен е ясно, обаче проблема ми е, че ми трябва да е по-малко асинхронен.
Става въпрос за над 100 производителя, всеки от които с един куп продукти. Обработката е доста сложна, особено за новите, къде се налага да се теглят и снимки освен цялата галимация с БД.
Та като се пусне по "нормалния" начин и апачито на ВПС-а започва да сгъва с 503. На дедикейтед в офиса всичко работи на 6, ама там са 16Г рам и 8 ядра.

Идеята ми е да огранича едновременните заявки до по-разумен брой.
Имам брояч, който се увеличава в beforeSend и намалява при complete/error. Въпроса как най-просто и по възможност без плъгини да реализирам задържане на заявката ако брояча е надвишил лимита. Или някакво enque на ajax-а.
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

А можеш ли някак да го позабавиш със setTimeout?
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

А можеш ли някак да го позабавиш със setTimeout?
Код:
function importManufacturer( actionUrl, manufacturer, manufacturerData ) {
	if( ajaxCount > 5 ) {
		setTimeout (importManufacturer( actionUrl, manufacturer, manufacturerData ), 1000 );
		return;
	}
	...
}

Uncaught RangeError: Maximum call stack size exceeded

Това го мъчих снощи, ама нещо явно не го правя като хората.
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Идеята на AJAX е да е асинхронен. За да останеш във функцията докато ти върне данните трябва да му зададеш да е async: false, по подразбиране е true ;)
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

И аз не съм убеден, че съм разбрал правилно идеята. Но си мисля, че можеш да събереш в масив всичко, което ти трябва и после да го пуснеш като една заявка към DB. Говоря за "... WHERE id IN ($ids_array)"
Т.е. да се опиташ да оптимизираш не Ajax-а, а заявките към базата данни.
Или пък да използваш JSON-обект.
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Нямали да ти свърши работа просто да си викаш importManufacturer на complete рекурсивно. Така след като завърши обработката на заявката ще подадеш следваща.
 
От: От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Идеята на AJAX е да е асинхронен. За да останеш във функцията докато ти върне данните трябва да му зададеш да е async: false, по подразбиране е true ;)

Това го знам, а най лесния начин ми е да му шибна async: false и тогава всичко работи само дето ще се пулиш на браузъра 15 минути. Освен това ВПС носи около 10 паралелни заявки и така обработката става по-бързо.

Това, че е асинхрнонен е ясно, обаче проблема ми е, че ми трябва да е по-малко асинхронен.
 
От: От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Нямали да ти свърши работа просто да си викаш importManufacturer на complete рекурсивно. Така след като завърши обработката на заявката ще подадеш следваща.

това също ?
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

И аз не съм убеден, че съм разбрал правилно идеята. Но си мисля, че можеш да събереш в масив всичко, което ти трябва и после да го пуснеш като една заявка към DB. Говоря за "... WHERE id IN ($ids_array)"
Т.е. да се опиташ да оптимизираш не Ajax-а, а заявките към базата данни.
Или пък да използваш JSON-обект.
То затова специално е надробено да се обработва на порции. И без това има още два паса на обработка преди това с обработка на CSV файл, превеждане, генериране на модели и спинване на мета описания. Става въпрос за opencart модул който ъпдейтва и добавя продукти. А и както писах за новите продукти се теглят и снимки.

Нямали да ти свърши работа просто да си викаш importManufacturer на complete рекурсивно. Така след като завърши обработката на заявката ще подадеш следваща.
Не става, всеки път се вика с различни данни.
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Здравей,
пробвай в колбека на ajax заявката да я извикаш сама себе си, т.е да породиш рекурсия и да обработваш информацията на порции. Може да си сложиш флаг за прекъсване на процеса и други екстри. Но трябва малко да си промениш логиката. Естествено вземи мерки да не изпаднеш в дедлок. Аз лично не бих използвал едновременни заявки в даденият случай. 'Слабото ти място' е канала на връзката (скорост на доставяне на информацията от отсрещната страна), не самата обработка на данните. Колкото и нишки да писнеш като се запуши тръбата няма да пусне повече.
Поздрави.
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Общо взето се реши доста просто
Код:
function importManufacturer( actionUrl ) {
	if( ajaxCount > 10 ) {
		return;
	}

	if( 0 == jsonData.length ) {
		return;
	}

	manufacturerData = jsonData.shift();
...
и в 
		    complete : function() {
		    	ajaxCount--;
		    	
		    	importManufacturer( actionUrl );
Пак си ги извъртам в цикъл всичките, колкото захапе толкова. като се изпълни някой рикуест шифтва следващия от масива и готов.
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Ами даде на ли точно това ти казах .. релурсивно си викаш importManufacturer при complete ;)
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Ами даде на ли точно това ти казах .. релурсивно си викаш importManufacturer при complete ;)
Е да де, ама що не каза да изнеса данните в глобална променлива и да ги шифтвам от там :p
А ме остави -> :cry:
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Отлична идея. Дори може още да се доразвие, но както и да е. Интересно ми е ползвал ли си М:https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers .
въртят ми се тука едни подобни проблеми ама свързани с календари и събития от календари, та за това питам.
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Отлична идея. Дори може още да се доразвие, но както и да е. Интересно ми е ползвал ли си М:https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers .
въртят ми се тука едни подобни проблеми ама свързани с календари и събития от календари, та за това питам.
Не съм го ползвал това.
 
От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Стой настрана от setTimeout, търсиш си белята когато решиш да обработваш event-и с него. На някои хора машините са по-слаби, на други по-бързи, няма как да нацелиш правилния таймаут.

Научи как се прави callback при функциите. Малко е засукано и трябва въображение, но само така ще вкараш малко реален синхронизъм, без трикове. Освен ако не е по-лесно и ефективно цялата дандания да се направи на сървъра с една ajax заявка. Ето: http://dreamerslab.com/blog/en/javascript-callbacks/
 
От: От: jQuery - как да не се връща от функция, докато не приключи ajax request?

Научи как се прави callback при функциите. Малко е засукано и трябва въображение, но само така ще вкараш малко реален синхронизъм, без трикове. Освен ако не е по-лесно и ефективно цялата дандания да се направи на сървъра с една ajax заявка. Ето: http://dreamerslab.com/blog/en/javascript-callbacks/
Всичко стана чудно и елегантно без таймаути, дори се получи бонус на error push-вам обратно данните и се обработват отново. Просто вечерта като съм го мислил бях избушил и ми се въртяха само дърводелски решения в главата.

Освен ако не е по-лесно и ефективно цялата дандания да се направи на сървъра с една ajax заявка. Ето: http://dreamerslab.com/blog/en/javascript-callbacks/
Тя цялата дандания може да се пусне и в една конзола в php през кли и без никакъв ajax, ама се точи доста време и освен това трябва може да се изпълнява от тотално неграмотен технически персонал.
 

Горе