Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[javascript] een object afvangen nadat deze is gerturned

Pagina: 1
Acties:

  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
Hallo,

Ik ben bezig met wat javascript en loop tegen een issue. Door middel van Json haal ik een array op met daarin een hoop informatie. Wanneer ik 1 record uit deze array wil halen gebruik ik de $.each gevolgd met een if, zie code hieronder.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
        function getinfo(p) {
            $.getJSON('/jsonpagina.aspx', function(Data) {
                $.each(Data.subdata, function(i, obj) {

                    if (obj.id === p) {
                        var object = obj;
                            return object;
                    }
                });
            });

        }


Ik return nu het volledige object en hoop die uit de kunnen lezen door:
code:
1
var hello = getinfo(p);


Hello is nu echter altijd undefined dus ik heb het idee dat de manier waarop ik het object probeer te retourneren niet mogelijk is. Kan iemand mij opweg helpen? Ik heb wel dingen gevonden als: http://stackoverflow.com/...ction-returning-an-object
maar mijn object is toch al gevuld waarom kan ik deze dan niet helemaal mee sturen?

Dying is God's way of telling you, you've been FIRED.


Verwijderd

JSON request is natuurlijk asynchroon.

[ Voor 95% gewijzigd door Verwijderd op 24-05-2013 14:56 ]


  • Sleepkever
  • Registratie: Juni 2007
  • Laatst online: 22-11 00:12
Die stackoverflow die je gelinked hebt staat totaal lost van jou probleem.

Wat je even in de gaten moet houden is dat getJSON op de achtergrond gewoon een AJAX call is, oftewel, Asynchronous JavaScript and XML. Dit houdt in dat de functie asynchroon op de achtergrond gestart zal worden, en de mee gegeven functie aan zal roepen als hij klaar is.

De getInfo functie zelf doet alleen maar deze request starten, en daarna returnen. En aangezien getinfo geen return bevat zal hij dus altijd return terug geven. Iets returnen in de anonieme functie die je in getJSON mee geeft komt dus uiteindelijk uit ergens in de getJSON functie van jQuery. Iets waar je zelf niets aan hebt.

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 22-11 20:54
Dat komt omdat je een functie binnen een functie hebt die iets returned. Voorbeeld:

JavaScript:
1
2
3
4
5
6
7
8
9
function func()
{
    return function innerfunc()
    {
        return 'test';
    }
}

console.log(func());

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Als je dit weg wilt stoppen in een functie kun je het beste je method in een deferred wrappen:

JavaScript:
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
        function getinfo(p) {
            var deferred = $.Deferred();
            $.getJSON('/jsonpagina.aspx', function(Data) {
                $.each(Data.subdata, function(i, obj) {

                    if (obj.id === p) {
                        deferred.resolve(obj);
                        return false; // break out of loop
                    }
                });

                deferred.reject(); // item niet gevonden
            }).fail(function() {
                deferred.reject();
            });
            return deferred;
        }

getinfo(foo)
  .done( function( item ) {
     // doe iets met item
  })
  .fail( function() {
     // ophalen mislukt, doe iets leuks.
  });


Je kunt er ook voor kiezen om direct de callbacks te gebruiken, maar uit ervaring weet ik dat zodra alles wat complexer wordt je vast zit in een web van callbacks waar je niet blij van wordt.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
Thanks Grijze Vos dat was exact wat ik zocht. Het werkt nu zoals ik wil en ziet er een stuk netter uit :-)

Dying is God's way of telling you, you've been FIRED.


Verwijderd

$.getJSON() returnt zelf trouwens ook een object met een Promise interface:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
function getinfo(p) { 
    return $.getJSON('/jsonpagina.aspx');
} 

getinfo(foo) 
    .done( function( json ) { 
        // doe iets met item 
    }) 
    .fail( function() { 
        // ophalen mislukt, doe iets leuks. 
    });

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
dan is het nog makkelijker te doen (ik gebruik getjson nooit :P):

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function getInfo(p) { 
    return $
        .getJSON( foo )
        .pipe( function ( data ) {

             var ret = null;

             $.each(data.subdata, function(i, obj) { 

                      if (obj.id === p) { 
                          ret = obj;
                          return false;
                      } 
             }); 
             return ret;
         });
}

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
Bedankt voor jullie antwoorden, ondertussen is het helemaal gelukt om de informatie te tonen die ik wil.

Als ik mijn code nu evalueer dan heb ik het idee dat ik niet heel efficiënt te werk ga. Mijn json resultaat bestaat uit twee objecten die ieder een variabel aantal array's bevat. De twee objecten zijn players en rooms. Er zitten meerdere referenties tussen beide objecten. Players heeft bijvoorbeeld een referentie naar rooms op basis van roomid. Op die manier kan ik dus alle players die in een specifieke room zitten tonen. Op dit moment doe ik dat door opnieuw een json call te doen waarbij ik de room id meegeef en door de players object ga.

Mijn vermoeden is dat dit niet heel slim is en dat het mogelijk is allemaal in 1 getJSON te doen maar ik kom er niet uit. Hoe zou ik bijvoorbeeld alle spelers in een specifieke room uit mijn json resultaat kunnen halen. Mijn json resultaat ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"players":
[{
"a": 1,
"b": 2,
"etc": etc,
"room": 12
}],
"rooms":
[{
"id": 12,
"a": 1,
"b": 2,
"etc": etc
}}]}

Dying is God's way of telling you, you've been FIRED.


  • jurrie
  • Registratie: Februari 2000
  • Laatst online: 28-12-2022
Als je alle spelers uit je json-object wilt halen, op basis van wat je gepost hebt, zou dat ong als volgt kunnen (ongetest):


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getPlayersInRoom(room, playersObj) {
    var players = [];
    
    $.each(playersObj, function(idx, val) {
        if ('room' in val && val.room == room) {
            players.push(val);
        }
    });
    
    return players;
}

var jsonObj = getinfo(...);
var room12Players = getPlayersInRoom(12, jsonObj.players);

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
jurrie schreef op dinsdag 11 juni 2013 @ 13:16:
Als je alle spelers uit je json-object wilt halen, op basis van wat je gepost hebt, zou dat ong als volgt kunnen (ongetest):


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getPlayersInRoom(room, playersObj) {
    var players = [];
    
    $.each(playersObj, function(idx, val) {
        if ('room' in val && val.room == room) {
            players.push(val);
        }
    });
    
    return players;
}

var jsonObj = getinfo(...);
var room12Players = getPlayersInRoom(12, jsonObj.players);
Doe dan iets als
JavaScript:
1
2
3
4
5
6
function getPlayersInRoom( players, room ) {

  return $.grep( players, function( player ) {
    return player.room === room;
  });
}


Of als je geen jQuery gebruikt maar gewoon vanilla JS (en maling hebt aan IE8 en lager)

JavaScript:
1
2
3
4
5
6
function getPlayersInRoom( players, room ) {

  return players.filter( function( player ) {
    return player.room === room;
  });
}
Pagina: 1