我有一個應用程序,顯示一個YouTube視頻,並有一個速率按鈕,讓用戶喜歡或不同於視頻。在點擊事件中,3個函數被稱爲通過ajax的success
函數鏈接在一起。流程是這樣的:ytvRate()
- >getRating()
- >showRating()
YouTube Data API 3費率端點是否存在時間延遲?
當我登錄的行動和結果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
,則該編號會立即更新。爲什麼我不能以相同的效率獲得用戶評分?
您是否嘗試過對getRating請求禁用緩存? '$ .ajax({cache:false,...'。如果您以前請求過,響應可能會被緩存。否則,它們可能不會立即更新評級以對付垃圾郵件投票。 –
@MikeC Nice建議......我只是試了一下,結果是一樣的,沒有運氣 – mhatch
你可以發送一個POST請求而不是GET嗎?POST請求不應該被緩存,另一個選擇是將一個唯一的隨機緩存失效字符串附加到請求網址類似於&nocache = RANDOMSTRING。如果所有這些都失敗了,那可能是googleapis錯誤 –