Вывод JSON в коде остается неопределенным, но с предупреждением все в порядке, это проблема с областью действия? - PullRequest
1 голос
/ 18 июля 2011

Я использую API графа Facebook, чтобы получить список друзей пользователя и создать сообщение о статусе на основе шаблона и случайных друзей.Если я использую alert(response.data[0].name); вместо return(response);, мой код работает, и я вижу имя первого друга на Facebook.Когда я продолжаю в своем коде, он выдает ошибку как неопределенную.Основываясь на нескольких часах попыток решить проблему, я думаю, что у меня есть какая-то проблема с областью действия, которая не позволяет мне больше использовать ответ, или проблема с форматированием JSON.Я также попытался поиграть с JSON-анализом jQuery, но там не получил ничего дополнительного.

shuffle = function(v){
    for(var j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
    return v;
};

function getFriends() {
    FB.login(function(response) {
        if (response.session && response.perms) {
        FB.api('/me/friends', function(response) {
            return response;
        });
        }
    } , {perms:'publish_stream'});
};

function selectFriend(){
    var friends = getFriends();
    friends = friends.data[0];
    var findex = friends.length
    var randomNumber = (Math.floor( Math.random() * 10 ) % findex);
    return(friends[randomNumber].name);
};

function process(status){
    status = status[0].toString();
    var cindex = status.indexOf("{{friend}}");

    while (cindex != -1){
        status = status.replace("{{friend}}",selectFriend());
        cindex = status.indexOf("{{friend}}");
    }
    return(status);
};

function newStatus(){
    var status = [
        "This status is named {{friend}}",
        "This status loves {{friend}} but likes {{friend}} too.",
        "This status goes by {{friend}} but you can call it {{friend}} if you like.",
        "This status hates {{friend}}"
    ];

    status = shuffle(status);
    $('#status').text(process(status));
}

Код начинается с вызова newStatus () при щелчке.Вот как я реорганизовал свой код для работы после ответа jfriend00:

shuffle = function(v){
    for(var j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
    return v;
};

function newStatus(){
    var status = [
        "This status is named {{friend}}",
        "This status loves {{friend}} but likes {{friend}} too.",
        "This status goes by {{friend}} but you can call it {{friend}} if you like.",
        "This status hates {{friend}}"
    ];
    status = shuffle(status);
    status = status[0].toString();

    FB.login(function(response) {
        if (response.session && response.perms) {
        FB.api('/me/friends', function(response) {
            var friends = response.data;
            var findex = friends.length

            var cindex = status.indexOf("{{friend}}");

            while (cindex != -1){
                var randomNumber = (Math.floor( Math.random() * 10 ) % findex);
                var name = friends[randomNumber].name;

                status = status.replace("{{friend}}",name);
                cindex = status.indexOf("{{friend}}");
            }
            $('#status').text(status);
        });
        }
    } , {perms:'publish_stream'});
}

1 Ответ

2 голосов
/ 18 июля 2011

Возможно, проблема в том, что вызовы API FB асинхронны. Это означает, что когда вы вызываете FB.api (), он запускает Ajax-вызов FB. Ваш другой код продолжает выполняться, пока завершается вызов ajax. Фактически, ваш вызов getFriends завершается, а остальная часть selectFriend () запускается тоже до завершения вызова AJAX FB.

Затем, когда вызов API FB завершается, он вызывает функцию завершения (возможно, там, где вы поместили предупреждение). В вашем коде вы не делаете ничего значимого в функции завершения. Вы просто возвращаете ответ с

return response;

Но это ничего не дает. Это возвращаемое значение не является возвращением из функции getFriends (). Это возвращение к чему-то внутри движка AJAX.

Если вы хотите сделать что-то полезное с ответом FB.api(), вам нужно запустить этот код или вызвать этот код из функции завершения, указанной в вызове FB.api().

Вы должны будете сделать что-то вроде этого псевдокода:

function getFriends() {
    FB.login(function(response) {
        if (response.session && response.perms) {
        FB.api('/me/friends', function(response) {
            var friends = response.data[0];
            var findex = friends.length
            var randomNumber = (Math.floor( Math.random() * 10 ) % findex);
            var name = friends[randomNumber].name;
            // now continue on with whatever you want to do with the random friend info
            // you cannot just return data from this callback, you have to actually carry
            // out whatever you were going to do with the data here
        });
        }
    } , {perms:'publish_stream'});
};

function selectFriend(){
    getFriends();
    // the getFriends() function is asynchronous and the FB.api() call has not yet
    // completed so we can't do anything here yet as we have to wait for the
    // FB.api() call to finish first.
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...