Member 13788771 Ответов: 2

Javascript длина возвращаемого массива равна 0


Я извлекаю объект JSON из steam и помещаю его в массив SteamID. После этого я возвращаю массив, чтобы использовать его в других функциях. Но я так расстроен, что не могу работать с массивом после того, как верну его.
Кроме того, я не могу перебирать массив.. Но когда я проверяю консоль, я могу видеть, что есть какой-то массив с элементами внутри, но я просто не могу получить к нему доступ каким-то образом...

function example(){
var friendList = getFriendsOfUser(steamID);
console.log(friendList.length); // returns 0
}

function getFriendsOfUser(steamID){
    var steamFriendIDs = new Array();

    if (steamID == null || steamID == "") {
      url = "http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key="+_steamAPI+"&steamid=76561197960435530&relationship=friend";
    }
    else {
      url = "http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key="+_steamAPI+"&steamid="+steamID+"&relationship=friend";
    }

    $.ajax({
      dataType: "json",
      url: url,
      success: function(data){
        $.each(data["friendslist"]["friends"], function(index, value){
          steamFriendIDs.push(data["friendslist"]["friends"][index]["steamid"]);
        });
      }
    });

    return steamFriendIDs;
  }


Что я уже пробовал:

Возврат только объекта JSON не работает, потому что он показывает undefined.
То, как я это сделал, действительно дает массив с элементами внутри, но ничего не работает.

Я попытался получить к нему доступ, как:
function example(){
var friendList = getFriendsOfUser(steamID);
console.log(friendList[0].length); // cannot read property length of undefined...
}

2 Ответов

Рейтинг:
18

Richard Deeming

AJAX расшифровывается как Асинхронный Javascript И Xml. Ключевое слово здесь - "асинхронный". $.ajax(...) возврат вызова до запрос был сделан, поэтому ни один из результатов не доступен. Вы возвращаете пустой массив, который будет заполнен в какой-то момент в будущем.

Вам нужно заново продумать, как вы называете код. Вместо того, чтобы возвратить массив, нужно вернуть обещать из массива. Код, который использует массив, должен быть перемещен в продолжение этого обещания.

function getFriendsOfUser(steamID){
    var steamFriendIDs = [];
    var promise = $.Deferred();

    if (steamID === null || steamID === "") {
      url = "http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key="+_steamAPI+"&steamid=76561197960435530&relationship=friend";
    }
    else {
      url = "http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key="+_steamAPI+"&steamid="+steamID+"&relationship=friend";
    }

    $.ajax({
      dataType: "json",
      url: url
    }).done(function(data){
        $.each(data["friendslist"]["friends"], function(index, value){
          steamFriendIDs.push(data["friendslist"]["friends"][index]["steamid"]);
        });
        
        promise.resolve(steamFriendIDs);
    }).fail(function(jqXHR, textStatus, errorThrown){
        promise.reject(jqXHR, textStatus, errorThrown);
    });

    return promise.promise();
}

function example(){
    getFriendsOfUser(steamID).done(function(friendList){
        console.log(friendList);
    });
}

Отложенный объект | документация по API jQuery[^]


Рейтинг:
0

W∴ Balboos, GHB

Не используя ваш jquery, но ответ здесь: Аякс введение[^]

Вы заметите, что их вызов AJAX ждет ответа, проверив состояние готовности.

Это позволяет вам получить свои результаты из этого возврата после того, как он будет завершен на стороне сервера, и сообщает вам, что ваш ответ готов.