Miron Machnicki

Miron Machnicki Frontend Engineer

Temat: Sukces po wykonaniu kilku żądań ajaxowych.

Mam problem z wykonaniem jednej funkcji po zakończeniu kilku żądań ajaxowych. Problem polega na tym, że skrypt, który ma wykonań się po zaczytaniu ajaxów jest w zupełnie innym miejscu na stronie i nie zna nazw wcześniejszych funkcji ajaxowych. Problem rozwiązałem w sposób następujący:

1. Deklaruję globalną tablicę, która będzie zawierała nazwy funkcji, jako string czyli ['funkcjaA()','funkcjaB()'].
2. Przy deklarowaniu każdej funkcji, jej nazwa będzie dodawana do tablicy:
function funkcjaA(){return $.ajax...} tablica.push('funkcjaA()');

3. W ready umieszczę skrypt
$.when(eval(tablica.join())).done(function(){....});


Niby wszystko ok, ale nie bardzo jednak podoba mi się zastosowanie eval(), dlatego chciałbym się dowiedzieć, czy nie ma cie może lepszych pomysłów na rozwiązanie mojego problemu?

Dodatkowo chciałbym się zapytać, czy nie istnieje inna metoda na sprawdzenie wykonania wszystkich funkcji, która nie odpalałaby funkcji. $.when() odpala, a chciałbym je uruchamiać w innym miejscu.

konto usunięte

Temat: Sukces po wykonaniu kilku żądań ajaxowych.

Zamiast przekazywac string i potem go evalowac, czemu nie ustawisz po prostu funckji?


var doMe = function () {
alert('blabla');
}

var myAwesomeArray={};
myAwesomeArray.costam = function() { /* blablabal */ };
myAwesomeArray.innecostam = doMe;

A potem robisz po prostu loopa for (item in myAwesomeArray) (albo zwykly for zeby szybciej dzialal) i kazda z funkcji odpalasz jak leci :)

To tylko pierwszy, lepszy przyklad z brzegu, ale jesli probujesz cos evalowac w tym momencie, to znaczy ze znalazlem zle rozwiazanie swojego problemu :) Mysle ze za chwile posypie Ci sie tona innych rozwiazan, ktore tez beda sluszne;)

ps. Twoje pytanie jest typowo JSowe i nie wiele ma wspolnego z jquery :PAndrzej Winnicki edytował(a) ten post dnia 06.09.12 o godzinie 11:06

konto usunięte

Temat: Sukces po wykonaniu kilku żądań ajaxowych.

Jeżeli chodzi Ci o wyeliminowanie evala, to nie wiem czy nie najprostszym rozwiązaniem było by odkładnie do tej Twojej tablicy zamiast 'funkcjaA()' po prostu 'funkcjaA' i wtedy w $.when możesz zrobić coś na wzór:


(function () {
var funkcjaA = function () {
alert('Funkcja A');
},
funkcjaB = function () {
alert('Funkcja B');
},
funkcjaC = function () {
alert('Funkcja C');
},
tablica = [],
i, j;

tablica.push(funkcjaA, funkcjaB, funkcjaC);

for (i = 0, j = tablica.length; i < j; i += 1) {
tablica[i]();
}
}());


Zobacz: http://jsfiddle.net/pczeglik/5rEtJ/

Jeżeli korzystasz ze wzorca przestrzeni nazw, to trzeba było by to delikatnie zmodyfikować, ale nie powinno być z tym problemów :)

konto usunięte

Temat: Sukces po wykonaniu kilku żądań ajaxowych.

Piotr Czeglik:
Czyli powiedziales to samo co ja, tylko innymi slowami... ;)

konto usunięte

Temat: Sukces po wykonaniu kilku żądań ajaxowych.

Andrzej Winnicki:
Piotr Czeglik:
Czyli powiedziales to samo co ja, tylko innymi slowami... ;)

Plus dodałem link z przykładem ;)
Miron Machnicki

Miron Machnicki Frontend Engineer

Temat: Sukces po wykonaniu kilku żądań ajaxowych.

Dzięki za odpowiedzi. Mam jednak problem. Potrzebuję tę listę funkcji wrzucić jako parametr do $.when(). Stworzyłem coś takiego:
function allAjax(){
var d = $.Deferred();
var ajaxSuccess=0;
for (i = 0, j = ajaxArray.length; i < j; i += 1) {
$.when(ajaxArray[i]()).then(function(){
ajaxSuccess++;
if(ajaxSuccess==j) d.resolve();
});
}
return d.promise();
};
allAjax().then(function(){
TUTAJ MOJA FUNKCJA PO WYKONANIU WSZYSTKICH AJAXÓW
});


Nie mam pomysłu, jak to uprościć, bo coś takiego nie zadziała: $.when(ajaxArray).then();Miron Machnicki edytował(a) ten post dnia 07.09.12 o godzinie 10:32

konto usunięte

Temat: Sukces po wykonaniu kilku żądań ajaxowych.

Ponownie posłużę się przykładem ;) Tak na szybko zrobionym.

Zerknij tutaj: http://jsfiddle.net/pczeglik/fCcDT/1/

Mój pomysł opiera się na wywołaniu rekurencyjnym. Może Ci to pomoże :)

konto usunięte

Temat: Sukces po wykonaniu kilku żądań ajaxowych.

Po co uzywac when then jak jest milion innych, bardziej efektywnych sposobow by zrobid dokladnie to samo...

konto usunięte

Temat: Sukces po wykonaniu kilku żądań ajaxowych.

Andrzej Winnicki:
Po co uzywac when then jak jest milion innych, bardziej efektywnych sposobow by zrobid dokladnie to samo...

No to zaproponuj coś : )

konto usunięte

Temat: Sukces po wykonaniu kilku żądań ajaxowych.

Wiele rzeczy można wykonać na wiele sposobów :) Przykład Piotra jest spoko, przy czym $.when może przyjąć jako parametr tablicę składającą się z obiektów deffered, czyli zamiast rekurencyjnie wywoływać $.when dla każdej funkcji można podać tablicę, coś na zasadzie:

var a = [];

a[0] = $.ajax("http://search.twitter.com/search.json", {
data: {
q: "test1"
},
dataType: "jsonp"
});
a[1] = $.ajax("http://search.twitter.com/search.json", {
data: {
q: "test2"
},
dataType: "jsonp"
});
a[2] = $.ajax("http://search.twitter.com/search.json", {
data: {
q: "test3"
},
dataType: "jsonp"
});

$.when(a).then(function(reqs) {
for(var i = 0, l = reqs.length; i < l; i++) {
reqs[i].done(function(data) {
console.log(data.results);
});
}
});

Można też spróbować coś na zasadzie:


$.when.apply(null, a).then(function(b1, b2, b3) {
console.log(b1[0].results);
console.log(b2[0].results);
console.log(b3[0].results);
});​

Tylko w drugim przypadku musisz znać argumenty funkcji (ewentualnie można iterować po arguments).Mateusz G. edytował(a) ten post dnia 07.09.12 o godzinie 14:43



Wyślij zaproszenie do