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: 12 let
|
0