0

这段代码有问题吗?获得 429 响应并受到 API 的速率限制。这要怪我的循环吗?

function getCat(from_locat){

var art_count = 0,
section_to_display = '';
if (!from_local) {
    $.getJSON('/api/v2/help_center/sections.json').success(function(data) {
        sections = data.sections;
        sec_count = data.count;
    }).then(function() {
        $.each(sections, function(section) {
            if (document.location.toString().match(sections[section].id) !== null) {
                    sections[section].isactive = 'active'; // section heading active?
                }
                $.getJSON('/api/v2/help_center/sections/' + sections[section].id + '/articles.json?draft=false').success(function(data) {
                    $.each(data.articles, function() {
                        if (document.location.toString().match(this.id) !== null) {
                            this.isactive = 'active'; // activate this
                            section_to_display = this.section_id;
                        }
                    });
                    sections[section].articles = data;
                    art_count++;
                    if (art_count === sec_count) {
                        renderNav(sections, section_to_display);
                        if (typeof(Storage) !== "undefined") {
                            var cache_expiry = moment().add(20, 'minutes').format('X');
                            sessionStorage.setItem('cache_expiry', cache_expiry);
                            sessionStorage.setItem('sections', JSON.stringify(sections));
                        }
                    }
                });

});

4

1 回答 1

0

首先,你有两个循环,所以程序的复杂性/大“O”以二次方增长。因此,如果sections只有 10 个元素,您的代码至少会使用 (10^2) = 100 次上述 API。对于任何 API,该消耗率将很快导致 429。因此,请尝试降低代码的复杂性。

但是,现在,您的循环发出的请求比上述 API 在给定时间范围内允许的要多。为了处理更多请求,某些 API 要求您是经过身份验证的用户或拥有身份验证令牌。例如,GitHub 的 API限制请求如下:

速率限制

对于使用基本身份验证或 OAuth 的请求,您每小时最多可以发出 5,000 个请求。对于未经身份验证的请求,速率限制允许您每小时最多发出 60 个请求。未经身份验证的请求与您的 IP 地址相关联,而不是与发出请求的用户相关联。

因此,请检查 API 是否有这样的身份验证系统,可以让您发出更多请求。

于 2016-09-16T17:46:46.587 回答