我认为这更多的是时间而不是代码,所以我真的在寻找有关如何最好地获得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的完全新手,但即使我坐下来对这个解决方案印象非常深刻。在我被带走之前,在这方面,性能或安全方面是否有任何潜在的缺陷?
再次感谢您。
安德鲁
答案 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操作。