Piotr Stanek

Piotr Stanek Programista PHP /
JS developer

Temat: dostep do zmiennych

witam,

mam taki kod


//array in detail
console.log('start map');
for (var key in collection_id)
{
if (key != 'remove')
{
getDetail(collection_id[key])
}
}
console.log(collection_map);
console.log('end map');


metoda getDetail pobiera dane json i zapisuje wynik do tablicy collection_map


var collection_map = new Array();

function getDetail(id)
{
Ext.Ajax.request({
url: 'json/detail',
params: {
id : id,
kvsSource : 'IRC'
},
success: function(result2, request) {
collection_map[km2] = Ext.util.JSON.decode(result2.responseText).data;
console.log(result2);
km2++;
result2 = '';
}
});
return true;
}


Problem w tym, że collection_map mam puste mimo tego ze w metodzie jest ok

tak jak bym chciał pokazać collection_map zanim foreach pobierz wszystkie dane.. Ma ktoś jakiś pomysł??

Wszystko działa na Ext.JS

konto usunięte

Temat: dostep do zmiennych

Zauwaz ze robisz ajax calla, ktory jest asynchroniczny. Co to znaczy?
Znaczy to tyle, ze w momencie kiedy robisz getDetail(), javascript wpada do funkcji, robi calla i czeka na odpowiedz servera i dopiero dodaje informacje do collection_map - po jakims czasie. Kod leci dalej, kilka milisekund pozniej wpada na console.log(collection_map) i sie okazuje ze jest puste... Tak, wszystko wyglada tak jak powinno, tego bym sie wlasnie spodziewal ;)

By to potwierdzic, zrob console.log(collection_map) jako setTimeout (http://www.w3schools.com/js/js_timing.asp), na 500ms (zakladam ze server w tym czasie juz odpowiedzial, jak nie, to ustaw na wiecej) i zobacz czy tym razem console.log wypluje dane ktorych sie spodziewasz.

W getDetail() jak robisz ajaxa i masz console.loga w success'ie - ten zostanie odpalony dopiero jak dane wroca, ale jesli console.log wrzucisz chwilke przed return: true; to tez bedzie pustosc ;)
Piotr Stanek

Piotr Stanek Programista PHP /
JS developer

Temat: dostep do zmiennych

ok teraż śmiga. ale ja nie wiem ile mi zajmnie pobranie tych danych

co będzie jak potrwa to np 10 sek.?

może wyłączyć asynchroniczność Ten post został edytowany przez Autora dnia 22.09.13 o godzinie 17:31
Paweł Stefański

Paweł Stefański Front-end / Web
Developer

Temat: dostep do zmiennych

najlepsza metodą byłoby wykonanie reszty programu w jakimś dodatkowym callbacku (wtedy kiedy dane faktycznie już będą w tablicy map_collection;

coś w tym stylu:

var collection_map = new Array();

function collection_map_ok(){
// tutaj juz możesz operować na swojej tablicy
// mając pewnośc że jest wypełniona danymi)

console.log(collection_map.length);
console.log(collection_map);
console.log('end map');
}


var loaded = 0;
getDetail(id,callback,array_length)
{
Ext.Ajax.request({
url: 'json/detail',
params: {
id : id,
kvsSource : 'IRC'
},
success: function(result2, request) {
collection_map[km2] = Ext.util.JSON.decode(result2.responseText).data;
console.log(result2);
km2++;
result2 = '';

//callback będzię wywołany tylko jeżeli wszystkie
// elementy do tablicy zostaną zaciągnięte
loaded++;
if(loaded==array_length)
callback();
}
});
return true;
}





//array in detail
console.log('start map');

for (var key in collection_id)
{
if (key != 'remove')
{
getDetail(collection_id[key],collection_map_ok,collection_id.length);
}
}

/* reszta programu wylatuje do nowej metody/funkcji/callbacku
u mnie collection_map_ok()
console.log(collection_map);
console.log('end map');
*/


wyszło trochę przekombinowane :D ale callback wywoła się w odpowiednim momencie (nie testowałem więc mogą być minimalne błędy) przeanalizuj kod i powinieneś wiedzieć o co chodzi.

oczywiście to tylko jedna z propozycji rozwiązania problemu, wyłączenie asynchroniczności to też jakiś pomysł ale jak dla mnie trochę dziwny.

konto usunięte

Temat: dostep do zmiennych

Paweł S.:
wyszło trochę przekombinowane :D ale callback wywoła się w odpowiednim momencie (nie testowałem więc mogą być minimalne błędy) przeanalizuj kod i powinieneś wiedzieć o co chodzi.

Fakt, lekko przekombinowane i mozna zrobic to czysciej, ladniej i bez global vars'ow (ja przynajmniej tak bym zrobil), ale to co podales bedzie dzialac i rozwiazuje problem tu zaistnialy.

A co do samego ASYNC'a - nie, wylaczenie go to nie jest dobre rozwiazanie (bedzie dzialac) ale jest to zle podejscie do problemu. Czesto async wymusza przelaczenie mozgu w inny tryb, zwlaszcza jesli ktos sie bawi JSem a pochodzi np. z PHP. Sam sie czasami lapie na tym ze danych mi brakuje a po chwili sobie przypominam ze musze przeciez na nie poczekac ;)

Następna dyskusja:

Brak zmiennych $_SESSION po...




Wyślij zaproszenie do