我有一个显示YouTube视频的应用程序,并具有速率按钮,可让用户喜欢或与视频不同。在点击事件3上,将函数通过AJAX的success
函数一起链接在一起。流是这样的: ytvRate()
-> getRating()
-> showRating()
记录操作并结果时,getRating()
的响应没有我在ytvRate()
中发送的值。如果我等待一段时间并刷新页面,则getRating()
的结果正确。我在ytvRate()
中AJAX的成功函数中调用getRating()
。这是否意味着在收到成功响应之前不应调用该功能?
这是我日志的一个示例:
rating sent: like
call get rating
this is my rating: none
call show rating
您可以看到,从API返回的评级不正确 - 应该是我刚刚发送的评分。刷新后,相同的呼叫确实会返回正确的评分...因此,数据API是否会更新正确的信息?如何在发送请求的同一按钮上获得正确的评分?
这是功能(showRating
似乎与问题无关。只要获得正确的评分,它的工作正常 - 它不是。)
function ytvRate(id, rating, event){
event.preventDefault()
var apiKey = 'This is a valid key';
var client_id = 'This is a valid client id';
var redirect_uri = 'This is a redirect uri';
var scope = 'https://www.googleapis.com/auth/youtube';
var rateUrl = 'https://www.googleapis.com/youtube/v3/videos/rate?id='+id+'&key='+apiKey+'&rating='+rating;
if(getHash().access_token){
var token = getHash().access_token;
$.ajax({
type: "POST",
url: rateUrl,
beforeSend: function (request){
request.setRequestHeader('Authorization', 'Bearer ' + token);
},
success: function(data){
console.log('rating sent: '+rating);
getRating(id);
},
error: function(e) {
console.log(e);
}
});
} else{
window.location = 'https://accounts.google.com/o/oauth2/v2/auth?client_id='+client_id+'&redirect_uri='+redirect_uri+'&scope='+scope+'&response_type=token&prompt=consent&include_granted_scopes=false';
}
return false;
}
function getRating(id){
var getRatingUrl = 'https://www.googleapis.com/youtube/v3/videos/getRating?id='+id;
console.log('call get rating');
if(getHash().access_token){
var token = getHash().access_token;
$.ajax({
type: "GET",
url: getRatingUrl,
beforeSend: function (request){
request.setRequestHeader('Authorization', 'Bearer ' + token);
},
success: function(data){
var rating = data.items[0].rating;
console.log("this is my rating: " + rating);
showRating(rating, id);
}
});
}
}
function showRating(response, id){
console.log('call show rating');
numLikes(id);
if(response == 'like'){
document.getElementById("notliked").className = "hide";
document.getElementById("liked").className = "";
document.getElementById("like-btn").style.color = "#87CEFA";
document.getElementById("like-btn").setAttribute("onclick", "ytvRate('"+id+"', 'none', event)");
} else{
document.getElementById("notliked").className = "";
document.getElementById("liked").className = "hide";
document.getElementById("like-btn").style.color = "inherit";
document.getElementById("like-btn").setAttribute("onclick", "ytvRate('"+id+"', 'like', event)");
}
}
编辑:
有趣的是,如果我以新方法而不是youtube/v3/videos/getRating
调用youtube/v3/videos
资源并访问statistics.likeCount
,则该数字将立即更新。为什么我不能以相同效率接收用户评级?
在评论中讨论后,我建议您采用其他方法。当ytvRate
成功时,您不需要获取getRating
,因为您已经知道用户设定的评级是什么。
rate
方法就像是常规编程语言中的设置器一样 - 如果它成功(没有引发异常或返回错误),则可以假设当前值是您设置的而不再次拿出的值。在多线程/分布式环境中,这可能是错误的假设,但在您的情况下可能还可以。
function ytvRate(id, rating, event){
...
success: function(data){
console.log('rating sent: '+rating);
showRating(rating, id);
}
...
}