Jquery中JSON AJAX响应的时间

时间:2012-05-11 21:30:54

标签: php jquery ajax json facebook-graph-api

我认为这更多的是时间而不是代码,所以我真的在寻找有关如何最好地获得JSON响应的最佳实践建议。

<script type="text/javascript">

            $(window).load(function() {
                $('#messages').append('<img src="images/loading.gif" alt="Currently Loading" id="loading" />');

                var ideaid = <?php echo $_GET['ideaid']; ?>;
                $.ajax({

                    url: 'sql/ajaxsql.php',
                    type: 'POST',
                    data: 'switch=commentList&ideaid=' + ideaid + '&filter=sortdate',
                    dataType: 'json',

                    success: function(result) {
                        var len = result.length;
                        var html;
                        console.log('length= ' + len);
                        $('#response').remove();
                        console.log(result);
                        for(var i = 0; i < len; i++) {
                            var pic = '<img src="https://graph.facebook.com/' + result[i].user_id + '/picture&type=small" align="middle" />';
                            var authname;
                            FB.api('/' + result[i].user_id + '?fields=name', function(AuthName) {
                                console.log(AuthName);
                                alert(AuthName.name);
                               authname = AuthName.name;

                            });
                            html = '<p>' + result[i].comment + '<br><hr>Date Added: ' + result[i].date + ' by ' + pic + ' ' + authname + '<br><hr><hr></p>';
                            $('#comms').append(html);

                        }

                        $('#loading').fadeOut(500, function() {
                            $(this).remove();

                        });
                    }
                });

                return false;
            });

        </script>

使用此代码,它会触发以获取有关某个想法(idea_id)的评论。评论仅包含用户ID(Facebook)。当所有数据都返回时,成功然后按照某种顺序将准备打印的数据排序到屏幕上。

作为成功的一部分,我在每条评论下都有日期,时间,FB图像和名称作为作者信息的一部分。

日期和时间,有效。使用图形的图像可以工作,但是名称在窗口加载时稍晚,因此错过了它的调用,因此返回为未定义,然后警报弹出名称。我知道ajax就是为了做到这一点。

什么是最好的解决方法。

提前谢谢。

安德鲁

修改

即使有以下建议,我也无法完成这项工作。

再次编辑刚刚看到bf新的更新版本,如下所示。也会有效。但是我花了一天时间来完成这一功能而又不敢玩。

一旦FB.api进场,我就无法从外面获得价值。所以我采取了不同的方法。

而不是ajax,我使用来自PHP端的查询获取数据,包括uid然后json查询,并将其固定到(mysql_fetch_array)数组,如下所示:

         $gc_result = mysql_query($gc_query);
    while ($result = mysql_fetch_array($gc_result)) {
        $jsonURL = "https://graph.facebook.com/" . $result['user_id'] . "/";
        $json = json_decode(file_get_contents($jsonURL), true);
        $result["name"] = $json['name'];

        $data[] = $result;
    }

    echo json_encode($data);

现在我有了,然后我可以执行以下操作并在jQuery中调用它:

for(var i = 0; i < len; i++) {
    var pic = '<img src="https://graph.facebook.com/' + result[i].user_id + '/picture?type=small" align="middle" />';
     html = '<p>' + result[i].comment + '<br><hr>Date Added: ' + result[i].date + ' by ' + pic + ' ' + **result[i]['name']** + '<br><hr><hr></p>';
     $('#comms').append(html);  
                        }

这一切都很好用,我是编程jquery并使用Facebook API和JSON的完全新手,但即使我坐下来对这个解决方案印象非常深刻。在我被带走之前,在这方面,性能或安全方面是否有任何潜在的缺陷?

再次感谢您。

安德鲁

2 个答案:

答案 0 :(得分:2)

FB.api的调用可能是异步的(另一个ajax请求),因此您必须将代码移到FB.api回调中:

FB.api('/' + result[i].user_id + '?fields=name', function(AuthName) {
    console.log(AuthName);
    alert(AuthName.name);
    authname = AuthName.name;
    html = '<p>' + result[i].comment + '<br><hr>Date Added: ' + result[i].date + ' by ' + pic + ' ' + authname + '<br><hr><hr></p>';
    $('#comms').append(html);
});

由于for循环,您还有一个可变范围问题。解决此问题的方法之一是使用单独的函数来创建回调。在$(window).load阻止</script>之前添加此权限:

function createFbApiCallback(jsonResult) {
    return function(AuthName) {
        var authname = AuthName.name;
        var pic = '<img src="https://graph.facebook.com/' + jsonResult.user_id + '/picture&type=small" align="middle" />';
        var html = '<p>' + jsonResult.comment + '<br><hr>Date Added: ' + jsonResult.date + ' by ' + pic + ' ' + authname + '<br><hr><hr></p>';
        $('#comms').append(html);
    }
}

然后将你的循环改为:

for(var i = 0; i < len; i++) {
    FB.api('/' + result[i].user_id + '?fields=name', createFbApiCallback(result[i])); 
}

答案 1 :(得分:0)

如果必须执行依赖于另一个回调函数内部的回调函数的代码,请在最内部回调函数中执行代码。在你的情况下,将FB API回调中的所有内容移到其中,所以只有当AJAX响应和FB.api响应都返回时,才会完成所有DOM操作。