Слишком много рекурсии при проверке случайных чисел js - PullRequest
0 голосов
/ 02 мая 2020
    // Data variables
var infiniteResponse;
var searchBResponse;

// Confirms that there are all the sites on the page
var confirmationOfFullSites;

var sitesOnPage = [];


var brLength= document.querySelectorAll("br").length;
var whereToAddIt= document.querySelectorAll("br")[brLength-1];


var observer = new IntersectionObserver(function(entries){
    entries.forEach(function(entry) {
        if (entry.isIntersecting) {
            getDataInfiniteS();
        }
    });
});
observer.observe(whereToAddIt);


// XMLData -------
function xmrResponse() {
    // Gets info
    var xml= new XMLHttpRequest();
    xml.onload= function() {
        infiniteResponse= xml.responseXML.children[0].children;
    };
    xml.open("GET", "http://127.0.0.1:5500/JS/InfiniteScrolling/InfiniteScrollingInfo.xml");
    xml.send();
}

function xmrResponse2() {
    // Gets urls from database
    var xml2= new XMLHttpRequest();
    xml2.onload= function() {
        searchBResponse= xml2.responseXML.children[0].children;
    };
    xml2.open("GET", "http://127.0.0.1:5500/JS/CentralSearchBarInfo/CSearchBarInfo.xml");
    xml2.send();
}


// Data checker
function getDataInfiniteS() {

    if (infiniteResponse === undefined) xmrResponse();
    if (searchBResponse === undefined) xmrResponse2();


    InfiniteScrolling();

}

// Actual script
function InfiniteScrolling() {

    var section;
    var language;
    var code;

    // Checks in what section of the site you're in
    var sections= ["Important.html", "Games.html", "Strange.html", "Cool.html", "Useful.html", "Funny.html", "Edit.html", "Useless.html"];

    for (let i= 0; i < sections.length; i++) {
        if (location.href.includes(sections[i])) {
            section = i;
            break;
        }
    }

    // Checks in what language
    var languages= ["Espa%C3%B1ol", "Italiano", "Suomalainen", "Deutsch", "Fran%C3%A7ais"];

    for (let i= 0; i < languages.length; i++) {
        if (location.href.includes(languages[i])) {
            language = i;
        }
    }

    if (language === undefined) language = 0;


    // It gets the first 5 sites that are already on the page and puts them inside sitesOnPage
    if (sitesOnPage[0] === undefined) {
        var h2s= document.querySelectorAll("h2");
        var site= infiniteResponse[0].children[section].children;

        for (var i=0; i < h2s.length; i++) { 

            if (h2s[i].innerHTML === site[i].textContent.replace(/["]/g, "'").split(", ")[0].replace(/[']/g, "")) sitesOnPage.push(i);

        }
    }


    function randomSiteInfosF(section, siteN) {

        // Checks if it's a number and not a string or something else
        if (typeof siteN !== "number") return;
        if (typeof section !== "number") return;


        siteChecker_RNG(section, siteN)


        // Infos about the site: desc, img, title
        //                  section  \/              the site infos              \/                   
        eval(`siteInfo${siteN}= infiniteResponse[0].children[${section}].children[${eval(`randomSite${siteN}`)}].textContent.replace(/["]/g, "'").split(", ")`);
        eval(`siteTitle${siteN}= siteInfo${siteN}[0].replace(/[']/g, "")`);
        eval(`siteDesc${siteN}= siteInfo${siteN}[1]`);
        eval(`siteImg${siteN}= siteInfo${siteN}[2].replace(/[']/g, "")`);
        eval(`siteURL${siteN}= siteInfo${siteN}[3]`);

    }


    function siteChecker_RNG(section, siteN) {

        // Checks if it's a number and not a string or something else
        if (typeof siteN !== "number") return;
        if (typeof section !== "number") return;

        //                          section  \/       how many sites \/  
        var sitesAvailable= infiniteResponse[0].children[section].children.length;
        var h2s= document.querySelectorAll("h2");
        var randomSiteN= Math.floor(Math.random() * sitesAvailable);

        //  Return if all sites are loaded
        if (h2s.length === sitesAvailable) return;


        // Checks if the random number is a correct one
        for (var i= 0; i < sitesOnPage.length; i++) {

            if (randomSiteN === sitesOnPage[i]) {

                siteChecker_RNG(section, siteN)

            } else continue;

        }

        eval(`randomSite${siteN}= randomSiteN`);

    }


    var howManySitesPerLoad= 3;


    for (let i= 0; i < howManySitesPerLoad; i++) {
        randomSiteInfosF(section, i);
    }



    // Creates a new div for the sites loaded from the database
    if (document.getElementById("InfiniteScrollingID") === null) {

        whereToAddIt.insertAdjacentHTML("afterend", "<div id='InfiniteScrollingID'></div>");

    }


    for (let i= 0; i < howManySitesPerLoad; i++) {

        if (eval(eval(`siteDesc${i}`)).includes('"; "')) {
            var lines= eval(eval(`siteDesc${i}`)).split('"; "');

            code= `<h2 class="lil" id="${eval(`siteTitle${i}`)}">${eval(`siteTitle${i}`)}</h2>\n<h3 class="lil">${lines[0].replace(/["|\\]/g, "")}</h3>\n<h3 class="lil">${lines[1].replace(/["|\\]/g, "")}</h3>\n<img src="${eval(`siteImg${i}`)}" alt="${eval(`siteImg${i}`).replace(".jpg", "")}" class="lul">\n</br>\n</br>\n<a href="${eval(eval(`siteURL${i}`)).replace(/["]/g, "")}" target="_blank" class="lil">${eval(eval(`siteURL${i}`)).replace(/["]/g, "")}</a>\n</br>\n</br>\n</br>\n</br>`;

            continue;
        }

        code= `<h2 class="lil" id="${eval(`siteTitle${i}`)}">${eval(`siteTitle${i}`)}</h2>\n<h3 class="lil">${eval(eval(`siteDesc${i}`))}</h3>\n<img src="${eval(`siteImg${i}`)}" alt="${eval(`siteImg${i}`).replace(".jpg", "")}" class="lul">\n</br>\n</br>\n<a href="${eval(eval(`siteURL${i}`)).replace(/["]/g, "")}" target="_blank" class="lil">${eval(eval(`siteURL${i}`)).replace(/["]/g, "")}</a>\n</br>\n</br>\n</br>\n</br>`;

        document.getElementById("InfiniteScrollingID").insertAdjacentHTML("beforeend", code);

    }

    for (var i=0; i < howManySitesPerLoad; i++) {

        sitesOnPage.push(eval(`randomSite${i}`))

    }

    brLength= document.querySelectorAll("br").length;
    whereToAddIt= document.querySelectorAll("br")[brLength-1];

    observer.disconnect()
    observer.observe(whereToAddIt)

}

В основном я пытаюсь проверить, является ли сгенерированное число правильным или нет, когда оно вызывается, оно создает бесконечное l oop, которое является рекурсией, если я правильно понял.

"sitesOnPage" - это массив, который со временем заполняется числами (пустыми в начале).

Я знаю, что eval не следует использовать часто и тому подобное. Подсказки, чтобы найти другой способ обойти это, приветствуются тем, что я не использую это часто сам.

Я использую базу данных, чтобы получить все данные для сравнения с числами.

Это является частью кода, который используется для моего сайта в его разделах, http://www.coolwebsites.ml/

https://youtu.be/QDrn_9svt6Y

CodePen: https://codepen.io/Attisalva/pen/pojdZXr?editors=1010

в примере с кодом ручки он загружает дубликаты, которых там быть не должно, и некоторые, которые уже загружены, я упростил работу прототипа, но он создает те же проблемы

...