YouTube数据API 3速率端点中是否有时间滞后



我有一个显示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);
    }
    ...
}

相关内容

  • 没有找到相关文章

最新更新