Ajax - Callback in Array speichern

Bansi

Mitglied
Hallo Leute,
ich hab leider kein richtigen Betreff gefunden um das Problem zu beschreiben.

So nun zu meinem Problem, ich habe 2 Funktionen und eine Array. In der Funktion "Init()"
wird die Array mit 2 Spielerdaten gefüllt.

Innerhalb der for schleife wird eine weitere Funktion aufgerufen "getPlayerId()" in der
ein Json String geparst wird. Mir ist leider nicht möglich den Rückgabewert in die Array zu speichern, da er nicht mehr weiss wohin er es abspeichern soll:

"Uncaught TypeError: Cannot read property 'PlayerId' of undefined "

Wie kann ich das Problem lösen? Beschäftige mich mit Javascript noch nicht solange um alle Möglichkeiten vorher auszutesten.

Dann habe ich noch eine Frage. Ist es Möglich das mein Script erst weiter läuft wenn alle "Players" eine Id haben? Da alles Asynchron abläuft, kann es doch passieren das beim nächsten Funktionsaufruf die variable Player[1]["PlayerId"] noch 0 ist und ich somit nicht weiter arbeiten kann.

Vielen Dank

Mfg Sebastian

Code:
        var Players = new Array("Name1", "Name2");
        var Player = new Array (Players.length);

        function init()
        {
                Players = new Array("Tarulis", "B4nsi");
                Player = new Array (Players.length);
                for (i = 0; i < Players.length; i++)
                {
                        Player[i]["Name"] = Players[i];
                        Player[i]["PlayerId"] = 0;

                        getPlayerId(Player[i],function(data) {
                                Player[i]["PlayerId"] = data; // Uncaught TypeError: Cannot read property 'PlayerId' of undefined         
                        });
                }
        }

        function getPlayerId(player,callback)
        {
                $.ajax({
                        url:      "https://census.soe.com/get/ps2/character/?name.first=" + player["Name"],
                        dataType: "jsonp",
                        success:  function(data)
                        {
                                player["PlayerId"] = data.character_list[0].id; // Uncaught TypeError: Cannot read property 'PlayerId' of undefined         
                                callback(data.character_list[0].id);
                        }
                });
        }
 
Ich staune gerade, dass der Fehler nicht bereits vier Zeilen vorher auftritt. Du müsstest nämlich definieren, dass es sich bei den Elementen in deinem Array um Objekte handelt:

Javascript:
var players = ["Name1", "Name2"];
var player  = new Array(players.length);

function init ()
{
  players = ["Tarulis", "B4nsi"];
  player  = new Array(players.length);
  
  for (var i = 0; i < players.length; ++i)
  {
    player[i] = {};
    player[i]["Name"] = players[i];
    player[i]["PlayerId"] = 0;
    
    getPlayerId(player[i], function (data) {
      player[i]["PlayerId"] = data;
    });
  }
}

// ...
 
Hi,

nachdem die Anzahl der Player bekannt ist, könntest du dein zweites Problem über einen Zähler lösen. Diesen setzt du zunächst auf die Anzahl der Spieler. In der callback-Funktion wird er dekrementiert und geprüft, ob er Null ist. Hat er diesen Wert erreicht, wurden alle Spieler geladen und es kann die gewünschte Funktion aufgerufen werden.
Code:
function init (){
  var players = ["Tarulis", "B4nsi"],
    player  = new Array(players.length),
    // Zähler initial auf Anzahl der Spieler setzen
    countDown = players.length;

  for (var i = 0; i < players.length; ++i){
    player[i] = {
      'Name': players[i],
      'PlayerId': 0
    };

    getPlayerId(player[i], function(data, player) {
      // Zähler dekrementieren
      countDown--;

      player['PlayerId'] = data;
      console.debug(player['Name'] + " loaded");

      // Falls der Zähler Null ist => alle Spielerdaten geladen => Wunschfunktion ausführen
      if(countDown === 0){
      	goTo('Alle da .. und ab die Luzi!');
      }
    });
  }
}

function getPlayerId(player, callback){
  $.ajax({
      url:      "https://census.soe.com/get/ps2/character/?name.first=" + player["Name"],
      dataType: "jsonp",
      success:  function(data){
      	console.debug("load " + player['Name'] + " ...");
        player["PlayerId"] = data.character_list[0].id;
        callback(data.character_list[0].id, player);
      }
  });
}

function goTo(message){
  console.debug(message);
}
Weiterhin muss in der callback, die der Funktion getPlayerId übergeben wird, aufgepasst werden, da hier der Laufindex i immer den Wert Zwei haben wird. Besser den aktuellen Player immer als Parameter übergeben.

Ciao
Quaese
 

Neue Beiträge

Zurück