[AJAX} Problemen met asynchroon werken.

Pagina: 1
Acties:

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Ik heb wat problemen met asynchroon werken. Waarschijnlijk denk ik op de verkeerd manier, misschien kunnen jullie me daarbij helpen.

Ik gebruik in mijn app. de web server als een soort remote DB. Ook dat doe ik losgekoppeld, zodat ik ook een lokale bron kan gebruiken, om te testen bijvoorbeeld.

Stel ik heb een Item object, welke omschreven wordt door een ItemType object. Voor beide classes heb ik een object waarmee ik ze kan bereiken, een repository, die, in het geval van de normale gang van zaken, de objecten bij de server ophaalt. Op de server zelf werk ik ook weer op zo'n manier, maar dan haal de repository de object direct uit de DB, en hoef ik niet asynchroon te werken.

Stel dat dit (een gedeelte van) de interface is:
code:
1
2
3
4
5
interface ItemRepository
{
  function getItemByID(ID);
  // etc.
}


Nu is hierbij al een probleem te ontdekken. get impliceert dat er iets gereturned gaat worden. In het geval van asynchroon werken krijg je niet direct een resultaat terug. Pas al de reactie aangekomen is, wordt deze afgehandeld. Op zich geen probleem, de interface wordt dan dit:

code:
1
2
3
4
interface ItemRepository
{
  function loadItemByID(ID, onloadEvent);
}


Waarbij onloadEvent een functie object is, welke wordt aangeroepen op het moment dat het Item is geladen, met als parameter het geladen Item.

Voor ItemType zou ik hetzelfde kunnen doen. Nu heb ik echt een probleem. Stel dat ItemType cruciaal is voor de constructie van Item, en ItemType wordt dan opgehaald. Dan moet de constructie van Item worden uitgesteld totdat ItemType is opgehaald. Op zich kan dit ook wel, via dat event. Maar stel dat er een collectie aan Items opgehaald wordt, en het event pas getriggerd mag worden als alle Items geladen zijn?

Dan krijg je dus te maken met een heel net van events. Het is op deze manier wel op te lossen (pseudo):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class ItemRepository
{
    function loadItems(onloadItemsEvent)
    {
        loadItemsData(
            function(itemsData)
            {
                items = new Array();
                for ( itemData in itemsData )
                {
                    ItemTypeRepository.loadItemType(
                        itemData.itemTypeID,
                        function(itemType)
                        {
                            item = ItemFactory.create(itemData, itemType);
                            items.push(item);
                            if ( items.length == itemsData.length )
                            {
                                onloadItemsEvent(items);
                            }
                        }
                    );
                }
            }
        );
    }
}


Maar ik twijfel erg of dit wel de juiste manier van werken is. Het laden van het ItemType samen met het Item (dus de data samen ophalen) is wat mij betreft geen optie, omdat ItemTypes mogelijk al in het geheugen zitten, en ik geen extra data wil versturen. Het zijn vrij grote objecten namelijk.

Misschien is er een andere manier van werken die beter is?

Noushka's Magnificent Dream | Unity