2016-12-05 2 views
0

YouTube 동영상을 표시하는 애플리케이션이 있으며 사용자가 동영상을 좋아하거나 좋아할 수있는 속도 버튼이 있습니다. click 이벤트에서 3 개의 함수는 ajax의 success 함수를 통해 함께 연결됩니다. ytvRate() ->getRating() ->YouTube Data API 3 속도 엔드 포인트에 시간차가 있습니까?

내가 조치를 기록하고 내가 ytvRate()에서 보낸 값이없는 getRating()의 응답 결과 showRating() : 흐름이있다. 잠시 기다렸다가 페이지를 새로 고치면 getRating()의 결과가 올바르게 반환됩니다. 나는 getRating()을 아약스의 성공 함수 안에서 ytvRate()이라고 부른다. 성공 응답을받을 때까지는 함수를 호출해서는 안된다는 뜻입니까? 여기

내 로그의 예입니다 : 당신이 볼 수 있듯이

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 리소스를 호출하고 statistics.likeCount에 액세스하면 즉시 번호가 업데이트됩니다. 동일한 효율성으로 사용자 등급을받을 수없는 이유는 무엇입니까?

+0

'getRating' 요청에서 캐싱을 사용하지 않으려 했습니까? '$ .ajax ({cache : false, ...}. 이전에 요청한 경우 응답이 캐시 될 수 있습니다. 그렇지 않으면 스팸 투표를 방지하기 위해 응답을 즉시 업데이트하지 않을 수도 있습니다. –

+0

@MikeC Nice 제안 ... 방금 시도한 결과가 동일합니다. 행운 없음 – mhatch

+0

GET 대신 POST 요청을 보낼 수 있습니까? POST 요청을 캐시해서는 안됩니다. 또 다른 옵션은 고유 한 무작위 캐시 유효성 검사 문자열을 & nocache = RANDOMSTRING과 같은 url을 요청하십시오. 모두 실패하면 googleapis 오류 일 수 있습니다. –

답변

0

의견에 대한 토론 후 다른 접근 방식을 제안합니다. ytvRate 성공시 사용자가 설정 한 등급이 무엇인지 이미 알고 있으므로 getRating을 가져올 필요가 없습니다.

rate 메서드는 정상적인 프로그래밍 언어에서의 setter와 같습니다. 예외가 발생하지 않았거나 오류가 반환되지 않은 경우 현재 값을 다시 가져 오지 않고 설정 한 것으로 간주 할 수 있습니다. 이것은 다중 스레드/분산 환경에서는 잘못된 가정 일 수 있지만 귀하의 경우에는 괜찮을 수 있습니다.

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

나는 이것을 시도했으나 요금 상태가 시작됩니다. 예를 들어, YouTube 페이지와 내 페이지 사이를 전환하면 내 사용자에 대해 서로 다른 평가를 표시 할 수 있습니다. 좋아하는 (파란색) 또는 등급이없는 (흰색) 아이콘이 하나만 표시되므로, ,이 사람 ts 내 앱에서 잘못된 요율 요청을 표시합니다. (좋아하는 것으로 표시됩니다 - 클릭하면 동영상과 같이 좋아하지 않는 youtube 요청과 달리 보낼 것입니다.) – mhatch

+0

내가 원하지 않는 행동을 막기 위해 googleapis에 대기 시간을 내장해야한다고 생각하는 경향이 있습니다. 그러나 이것이 무엇이 될지 모르겠습니다 ... 기본 YouTube 사이트에서 평가 동작이 즉각적입니다. – mhatch

+0

타사 앱에 지연이있을 수 있음에 동의합니다. 버튼을 표시하기 위해'getRating' initialy를 가져 오는 경우,'getRating'에서 반환 된'etag' 값을 사용하는 또 다른 해결책이 있습니다. 이 값을 저장할 수 있고, 등급 제출 및 getRating 후에'etag' 필드를 읽을 수 있습니다. 동일하면 평가가 아직 업데이트되지 않았 음을 의미합니다. 그런 다음 etag가 변경 될 때까지 다른 다시 페치를 지연시킬 수 있습니다. –