Zamrzání ajaxu při více požadavků v jeden čas

Alsatian
Člen | 164
+
0
-

Ahoj. Zamiloval jsem si ajax, mám ale následující problém, se kterým si zatím nevím rady.

Mám například upload obrázků, do kterého ajaxově přidávám další nebo je hromadně mažu.
Jednoduché, volám handler, ten něco provede a poté překreslím požadovaný snippet.

Používám ještě jedno ajaxové volání na pozadí webu a to na kontrolu nových zpráv, takové notifikace. Nevím, například že přišla nová faktura, cokoli.

Zjistil jsem, že pokud probíhá ajax požadavek, třeba zmíněný upload obrázků, déle a do toho se provede jiný ajax požadavek, tedy kontrola nových notifikací, snippet už s dokončením uploadování (třeba) se mi nepřekreslí. Jakmile se tedy potkají dva ajax požadavky, což se normálně neděje, tak ten první už zřejmě nepřekreslí snippet. Pokud ručně refrešnu stránku, vidím, že se soubory nahrály.

Netuší někdo jak na to? :)

Alsatian
Člen | 164
+
0
-

Chápu správně, že stačí před volání $.nette.ext({… vložit:

$.nette.ext('unique', false);

Nějak nemůžu dostat do hlavy, co je to vytvořit si vlastní extension… Jak potom vím, kdy se volá a podobně.

CZechBoY
Člen | 3608
+
0
-

Vola se kdy si urcis. tzn. treba po prekresleni snippetu

$.nette.ext({
    init: function() {
        this.ext('snippets').after(function($snippet) {
        ...
        });
    }
});

psano z hlavy tak tam mozna bude nejaka drobnost jinak…

Alsatian
Člen | 164
+
0
-

@CZechBoY , prosím tě, na zjišťování nových notifikací mám v javascriptu následující kód. V něm je spinnerOff: true – což nefunguje a spinner se při každém spuštění zobrazí. Tedy pokaždé, když na pozadí JS testuje přítomnost nových zpráv.
Spinner se mi jinak na ostatní akce líbí, chtěl bych jej zachovat. Používám extension: spinner.ajax.js

	$(document).ready(function() {
		function f_cmsTimer() {
			// oznameni v horni admin liste
			$.nette.ajax({
				url: '?do=cmsAlertCheck',
				dataType: 'json',
				spinnerOff: true,
			}).done(function(data) {
				//... zobrazení notifikace ...
			});

			var cmsTimer = window.setTimeout(function () {f_cmsTimer();}, 20000); // opet spustime
		}
		$(document).ready(function() {
			f_cmsTimer(); // prvni spusteni
		});
	});

Možná na to jdu úplně špatně, nevím.

Editoval Alsatian (2. 2. 2019 14:39)

Alsatian
Člen | 164
+
0
-

Nakonec jsem vybojoval :)

Pozměnil jsem soubor spinner.ajax.js, ve kterém testuji, jestli se má spinner spustit pomocí „spinnerOff“

start: function (xhr, settings, e) {
		this.counter++;
		//if (this.counter === 1) {
		if (this.counter === 1 && !settings.spinnerOff) {
			this.spinner.show(this.speed);
		}
	},
CZechBoY
Člen | 3608
+
0
-

btw mas tam zdvojeny napojeni na dom ready, ale to je drobnost