ajax více requestů čekání na dokončení requestu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tatyalien
Člen | 239
+
0
-

Ahoj,
předem se omlouvám, ale javascript moc neumím…

používám závislé selectboxy, kde si data tahám pomocí:

function test(link, parametry, tmpFormIdForRefresh)
{
	$.nette.ajax({
				type: 'POST',
				url: link...,
				data: { params: parametry... },
				async: true,
				success: function(payload) {
					var options = [];
					payload.forEach(function(item) {
						options.push("<option");
						if(item.selected)
						{
							options.push(" selected");
						}
						options.push(" value='"+ item.value + "'");
						options.push(" title='"+ item.title + "'");
						options.push(">" + item.label + "</option>");
					});

					if(document.getElementById(tmpFormIdForRefresh) !== undefined) {
						$("#" + document.getElementById(tmpFormIdForRefresh).id).empty().append(options.join(''));
						$("#" + document.getElementById(tmpFormIdForRefresh).id).selectpicker('refresh');
					}

					return true;
				}
			});
}

Nyní bych ale potřeboval, aby se odeslalo více dotazů, například mám divize, oddělení, tým. a pokud načítám data pro divize, aby se následně pustilo načítání oddělení a po načtení týmy.

pokud to nastavím:

		$('#frm-divize').change(function(event) {
			var tmpFunctionParams = function() { return getAjaxParams() };
			test(link, parametry, tmpFormIdForRefresh);
			//pokud dám hned link2 tak se předchozí request ukončí a pokračuje až druhý, jak zajistit volání až po doběhnutí prvního?
			test(link2, parametry2, tmpFormIdForRefresh2);
		});

Editoval tatyalien (2. 5. 2017 13:56)

David Matějka
Moderator | 6445
+
0
-

nette.ajax ma defaultne zapnute extension, ktere ukoncuje requesty, pokud vznike nejaky novy. to extension muzes vypnout pomoci

$.nette.ext('unique', null);
tatyalien
Člen | 239
+
+1
-

Díky, ale to jen odešle vše naráz… ale nečeká to na výsledek requestu.. takhle může doběhnout například 3tí ajax před prvním.

		if(document.getElementById('cDepartment_id_refresh') != undefined)
		{
			document.getElementById('cDepartment_id_refresh').onclick = function () {
				var tmpFunctionParams = function() { return getAjaxParams() };
$.nette.ext('unique', null);

$.nette.ajax({
    ...
});

$.nette.ajax({
    ...
});

$.nette.ajax({
    ...
});


$.nette.ext('unique', {
    start: function (xhr) {
        if (this.xhr) {
            this.xhr.abort();
        }
        this.xhr = xhr;
    },
    complete: function () {
        this.xhr = null;
    }
}, { xhr: null});
			};
matopeto
Člen | 395
+
0
-

ten dalsi vzdy zavolaj v success toho predchadzajuceho.

Editoval matopeto (2. 5. 2017 14:52)

tatyalien
Člen | 239
+
0
-

A jiná možnost není? To js si generuji, a takto je to jen jednoduchý foreach, takhle budu muset řešit rekurzi.

matopeto
Člen | 395
+
0
-

No stale to mozes vsetko vygenerovat a stiahnut v jednom ajaxe :) nevidim zmysel to rozdelovat na tri.

Pripadne si napis univerzalny wrapper, kde prasknes zoznam vsetkych xhr requestov na vstup a on ich bude volat seriovo vzdy v success callbacku.

BTW rekurzia nie je zla, ak sa dobre pouzije :)

Editoval matopeto (2. 5. 2017 14:59)

tatyalien
Člen | 239
+
0
-

Díky, nějak to udělám :)

CZechBoY
Člen | 3608
+
0
-

Jako ono to nebude asi moc složitý… Co takhle?

{define ajaxSuccChain}
{var $url = array_shift($urls)}
{if $url}
	$.ajax({
		url: {$url}
		{if !empty($urls)},
		success: function () {
			{include ajaxSuccChain, urls => $urls}
		}
		{/if}
	});
{/if}
{/define}
tatyalien
Člen | 239
+
0
-

Ahoj,
tak generování mám trochu jinak, ale jedu to tedy vždy v tom success požadavku, ale indikátor načítání (kolečko) u metody before, complete nějak blbne. První request zobrazí kolečko, pak zmizne a běží další request bez kolečka, pak některý request ho ukáže…

		function getAjaxSelect(objectForAjax, position)
		{
			if(objectForAjax[position].link != undefined)
			{
				$.nette.ajax({
					type: 'POST',
					url: objectForAjax[position].link,
					...
					success: function(payload) {
						...
						getAjaxSelect(objectForAjax, (position +1));
						return true;
					},
before: function () {
    $("body .ajax-loading").fadeIn(200);
},
complete: function () {
    $("body .ajax-loading").fadeOut(200);
}
				});
			}
CZechBoY
Člen | 3608
+
0
-

To vygeneruj tím mým způsobem… v prvním before dáš zobrazit spinner, v posledním v success ho zase schováš.

matopeto
Člen | 395
+
0
-

Pouzi skorej spinner extension, klasicku, ta vie fungovat s viac ajax requestami…

tatyalien
Člen | 239
+
0
-

matopeto napsal(a):

Pouzi skorej spinner extension, klasicku, ta vie fungovat s viac ajax requestami…

V projektech používám:

$.nette.ext('loading', {
    before: function () {
        $("body .ajax-loading").fadeIn(200);
    },
    complete: function () {
        $("body .ajax-loading").fadeOut(200);
    }
});
matopeto
Člen | 395
+
0
-

tatyalien napsal(a):

matopeto napsal(a):

Pouzi skorej spinner extension, klasicku, ta vie fungovat s viac ajax requestami…

V projektech používám:

$.nette.ext('loading', {
    before: function () {
        $("body .ajax-loading").fadeIn(200);
    },
    complete: function () {
        $("body .ajax-loading").fadeOut(200);
    }
});

Pozri tu: https://github.com/…nner.ajax.js vstavana spinner extension ma podporu viacerych ajax volani, takto ked pustis dva naraz, tak spinner ti skonci po prvom…

tatyalien
Člen | 239
+
0
-

Díky, aktualizuji si to :)
Nicméně tady jsem to vyřešil tak, že na té stránce vypnu základní extension loading a prvnímu requestu zobrazím spinner a odmazávám až u posledního.