ajax více requestů čekání na dokončení requestu
- tatyalien
- Člen | 239
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
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
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
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
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);
}
});
}
- tatyalien
- Člen | 239
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
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…