我需要帮助:AJAX请求错误net :: ERR_TOO_MANY_REDIRECTS

时间:2017-12-29 15:44:20

标签: javascript jquery ajax google-chrome google-chrome-extension

我的Chrome扩展程序的许多用户都报告了此错误。问题是我无法解决它。其中一个原因是它在我的电脑上工作正常。

这是产生问题的页面。

    // napravi glavni objekat - main
let main = {};
// napravi prazan niz u koji treba uneti valute
let coins = [];

chrome.storage.local.get('main', e => {
    if(e.main){
        main = e.main
        if(main.timestamp){
            let time_difference = Math.floor((new Date().getTime() - main.timestamp) / 1000);

            if(time_difference > 150){
                // pokreni glavnu funkciju prvi put
                check_convert_and_get_json();
            }
        }
    }
    else{
        // pokreni glavnu funkciju
        check_convert_and_get_json();
    }
});

// glavna petlja koja se poziva u odredjenom vremenskom intervalu
setInterval(() => {
    chrome.storage.local.get('main', e => {
        if(e.main) main = e.main;

        let time_difference = Math.floor((new Date().getTime() - main.timestamp) / 1000);
        if(time_difference >= 301){
            // pokreni glavnu funkciju
            check_convert_and_get_json();
        }
    });
}, 15000);

function check_convert_and_get_json(){
    // dohvati objekat convert
    chrome.storage.local.get('convert', (e) => {
        // ukoliko objekat konvert postoji, unesi ga u objekat main
        main['convert'] = e.convert ? e.convert : false;

        // u zvisnosti da li je korisnik podesio objekat convert, odredi URL za kripto-valute
        let coins_url = e.convert ? "https://api.coinmarketcap.com/v1/ticker/" + "?convert=" + e.convert + '&limit=0' : 'https://api.coinmarketcap.com/v1/ticker/?limit=0';

        // u zvisnosti da li je korisnik podesio objekat convert, odredi URL za celokupno trziste
        let market_url = e.convert ? "https://api.coinmarketcap.com/v1/global/" + "?convert=" + e.convert : 'https://api.coinmarketcap.com/v1/global/';

        // dohvati JSON
        get(coins_url, market_url);
    });
}

function get(coins_url, market_url){
    grab_data(coins_url)
        .then(data => {
            coins = [];
            // na osnovu dobijenog JSON objekta, izvuci potrebne podatke o valutama
            create_coins_object_inside_main_object(data);
        })
        .then(() => {
            // podesi trenutno vreme kako bi znali kada su rezultati poslednji put osvezeni
            let timestamp = new Date();

            // unesi timestam u objekat main
            main['timestamp'] = timestamp.getTime();

            grab_data(market_url)
                .then((data) => {
                    // na osnovu dobijenog JSON objekta, izvuci potrebne podatke o trzistu
                    create_market_cap_object_inside_main_object(data);
                })
                .then(() => {
                    // sacuvaj objekat main
                    chrome.storage.local.set({main}, function(){});
                })
                .catch(() => {
                    // sacuvaj objekat main
                    chrome.storage.local.set({main}, function(){});
                });
        });
}

function create_market_cap_object_inside_main_object(data){
    let market = JSON.parse(data);

    main['market_cap'] = {'total_market_cap_usd': market.total_market_cap_usd};
    if(main.convert) main['market_cap']['total_market_cap_' + main.convert.toLowerCase()] = market['total_market_cap_' + main.convert.toLowerCase()];
}

function create_coins_object_inside_main_object(data){
    JSON.parse(data)
        .filter(coin => {
            // prihvati samo one valute koje zadovoljavaju odredjene uslove
            return coin.id && coin.name && coin.symbol && coin.price_usd && coin.price_btc && coin.percent_change_24h;
        })
        .forEach(coin => {
            if(main.alerts){
                if(main.alerts[coin.name.toLowerCase()]){
                    if(main.alerts[coin.name.toLowerCase()].max < coin['price_' + main.alerts[coin.name.toLowerCase()].cur]){
                        chrome.notifications.create({
                            type: 'basic',
                            title: 'Green Alert',
                            message: 'Price of ' + coin.name + ' is above selected value.',
                            iconUrl: 'alert_up.png',
                            priority: 2,
                            requireInteraction: true
                          })
                    }
                    if(main.alerts[coin.name.toLowerCase()].min > coin['price_' + main.alerts[coin.name.toLowerCase()].cur]){
                        chrome.notifications.create({
                            type: 'basic',
                            title: 'Red Alert',
                            message: 'Price of ' + coin.name + ' is below selected value.',
                            iconUrl: 'alert_down.png',
                            priority: 2,
                            requireInteraction: true
                          })
                    }
                }
            }

            // na osnovu odredjenih parametara popuni coins niz
            populate_empty_object_and_push_it_to_coins_array(coin);
        });

    main['coins'] = coins;
}

function NotificationOptions(type, iconURL, title, message){
    this.type = type;
    this.iconURL = iconURL;
    this.title = title;
    this.message = message;
}

function populate_empty_object_and_push_it_to_coins_array(coin){
    // kreiraj prazan objekat koji zatim treba dodati na coins niz
    let empty = {};

    empty['id'] = coin.id;
    empty['name'] = coin.name;
    empty['symbol'] = coin.symbol;
    empty['price_usd'] = coin.price_usd;
    // proveri da li postoji konverzija u drugu valutu i obavi odgovarajucu radnju
    if(main.convert) empty['price_' + main.convert.toLowerCase()] = coin['price_' + main.convert.toLowerCase()];
    empty['price_btc'] = coin.price_btc;
    empty['percent_change_24h'] = coin.percent_change_24h;

    coins.push(empty);
}

function grab_data(url){
    return new Promise(function(resolve, reject) {
        var http = new XMLHttpRequest();

        http.onload = () => {
            if(http.readyState == 4 && http.status == 200){
                resolve(http.response);
            }
            else{
                reject(http.status);
            }
        }

        http.onerror = () => {
            reject(http.status);
        }

        http.open('get', url);
        http.send();
    });
}

我正在努力解决这个问题,但我不知道为什么现在发生这种情况,而不是在一两个月之前......

基本上,我需要获取JSON文件并从中提取一些信息。它在第一个请求中显示错误https://api.coinmarketcap.com/v1/ticker/?limit=0

Here is the link to my extension in Chrome store.

0 个答案:

没有答案