2016-12-05 117 views
0

我有一個應用程序,顯示一個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,則該編號會立即更新。爲什麼我不能以相同的效率獲得用戶評分?

+0

您是否嘗試過對getRating請求禁用緩存? '$ .ajax({cache:false,...'。如果您以前請求過,響應可能會被緩存。否則,它們可能不會立即更新評級以對付垃圾郵件投票。 –

+0

@MikeC Nice建議......我只是試了一下,結果是一樣的,沒有運氣 – mhatch

+0

你可以發送一個POST請求而不是GET嗎?POST請求不應該被緩存,另一個選擇是將一個唯一的隨機緩存失效字符串附加到請求網址類似於&nocache = RANDOMSTRING。如果所有這些都失敗了,那可能是googleapis錯誤 –

回答

0

在評論中討論後,我建議你採取不同的方法。當ytvRate成功時,您不需要獲取getRating,因爲您已經知道用戶設置的評分是什麼。

rate方法就像常規編程語言中的setter一樣 - 如果它成功(沒有拋出異常或返回錯誤),您可以假定當前值是您設置的值,而無需再次獲取它。這在多線程/分佈式環境中可能是錯誤的假設,但在您的情況下可能會好起來。

function ytvRate(id, rating, event){ 
    ... 
    success: function(data){ 
     console.log('rating sent: '+rating); 
     showRating(rating, id); 
    } 
    ... 
} 
+0

我試過這個...但是,例如,如果我在YouTube頁面和我的頁面之間切換,它可以爲我的用戶顯示不同的評分,因爲我有一個拇指圖標,可以顯示喜歡(藍色)或未分級(白色) ,這是結果在我的應用程序中顯示錯誤的費率請求。 (它會顯示爲喜歡 - 點擊將發送不同的請求,當你在YouTube上我沒有喜歡的視頻。) – mhatch

+0

我打算認爲googleapis必須有一些內置延遲來防止一些不想要的行爲,但我不知道這會是什麼......在本地YouTube網站中,評級行爲是即時的。 – mhatch

+0

我同意你的看法,第三方應用程序可能會有延遲。 如果您爲了顯示按鈕而獲取'getRating'初始值,那麼使用從'getRating'返回的'etag'值有另一個解決方案。你可以存儲這個值,然後在評級提交和getRating你閱讀'etag'字段。如果它相同,則表示評級尚未更新。然後,您可以延遲另一次重新讀取,直到電子標籤更改。 –