| Autor | Zpráva | ||
|---|---|---|---|
| Suta Profil |
Nevím si radu s následujícím:
// objekt uchovávající stažená data ze serveru
Zav.FileSystem.Data = {};
// metoda vracející konkrétní položky (volá pomocnou metodu _getItems() )
Zav.FileSystem.getItems = function ( obj ) {
// je-li obsah rodičovské položky uložen, vrátíme jej
if(Zav.FileSystem.Data[obj.parentId]) return Zav.FileSystem._getItems(obj.parentId);
// obsah rodičovské položky není uložen
// načteme jej ze serveru a poté se výsledek pokusíme vrátit
Zav.FileSystem.Ajax.send({
actionType: "loadItems",
data: { parentId: obj.parentId },
callback: function(textStatus,data) {
if(textStatus == "success") {
// zde probíhá uložení položek do objektu Zav.FileSystem.Data
....
// a poté se pokusíme data vrátit
// zde je problém, data nejsou uložena do proměnné myItemsArray
return Zav.FileSystem._getItems(data.parentId);
}
}
}
// metoda vracející položky uložené v objektu Zav.FileSystem.Data
Zav.FileSystem._getItems = function( parentId ) {
var array = [];
for(var param in Zav.FileSystem.Data) {
if(Zav.FileSystem.Data[param].parentId == parentId)
array.push(Zav.FileSystem.Data[param]);
}
return array;
}
// do této proměnné potřebuji uložit výsledná data, v případě uložení v objektu Zav.FileSystem.Data okamžitě, nejsou-li uložena, pak po stažení a uložení dat ze serveru
var myItemsArray = getItems( {parentId: 0 });Problém je zřejmě v callback metodě, kde návratový příkaz return přeruší kontext spojení s původní proměnnou. Poradil by mi někdo, jak problém řešit? Zkoušel jsem přidat další return před metodu Ajax, také nic. return Zav.FileSystem.Ajax.send({ ... |
||
| Suta Profil |
Suta:
Řešení pomocí return v tomto případě (asynchronní metoda ajax) neexistuje. Jediná možnost je tedy použití callbackové funkce, která bude zavolána, jakmile budou data dostupná. var _getItems = getItems( {
parentId: 0,
callback(textStatus,data){
if(textStatus == "success") {
// v proměnné data máme patřičné položky
myItemsArray = data;
}
}
});
// v proměnné _getItems může být uložen odkaz na xhmrequest, který může být v případě potřeby stornován přislušnou metodou |
||
| Chamurappi Profil |
#3 · Zasláno: 23. 1. 2012, 18:17:25
Reaguji na Sutu:
„Jediná možnost je tedy použití callbackové funkce“ Ano. V tom spočívá ta asynchronnost. Docela mě překvapuje, kolik lidí na tento problém naráží. Stačí se zamyslet, k čem ten onreadystatechange (nebo success v jQuery) je a proč vůbec existuje, ne?
|
||
|
Časová prodleva: 15 let
|
|||
0