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
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?

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0