0

I was able to fix this by changing the contents of the .push() of allTeams (second to last instance of .push() in the code)

The final return statement should return an array of objects. (allObjectTeams, right after await browser.close()), BUT it returns undefined

Placing the variable right above the return statement still does not solve the issue.

Commenting the biggest loop (the one that iterates over blocks.length) makes that final return statement work but I don't know what part of said loop is messing it up, Commenting out anything that does an action to this said variable doesn't solve the issue

makeTeam() is an instance of recursion but it looks fine to me. Essentially taking a random set of elements from the people array and placing it as a property of an object, then to add than object to an array, The function also removes the specific elements that were chosen from that array so if there are still more, It calls itself again. A heads-up but I don’t think it does anything.

I am using Puppeteer.

Code (JS):

const start = async () => {
    let teamSize = 2
    let allObjectTeams = [] //This is the variable I am trying to return
    let allTeams = []

    const browser = await require("puppeteer").launch()
    const page = await browser.newPage()

    await page.goto("https://www.when2meet.com/?16521246-5ySm2")

    const blocks = await page.$$("#GroupGridSlots > div")

    for (let i = 0; i < blocks.length; i++) { // This is the loop I'm talking about, blocks.length is finite. This loop does not go on forever for the return statement never to be called.
        await blocks[i].hover()

        const team = await page.$eval("#Available", ((availableList, teamSize) => {
            const people = availableList.innerHTML.split("<br>")
            people.pop()

            function getMultipleRandom(arr, num) { // Grabs random elements from array
                const shuffled = [...arr].sort(() => 0.5 - Math.random());

                return shuffled.slice(0, num);
            }

            if (people.length == teamSize) {
                const availableTeam = {}
                availableTeam.people = people

                return availableTeam
            } else if (people.length > teamSize) {
                const teamArray = []
                const makeTeam = (currentLength) => {
                    const availableTeam = {}
                    const teamPeople = getMultipleRandom(people, teamSize)
                    availableTeam.people = teamPeople
                    teamArray.push(availableTeam)
                    if ((currentLength - teamSize) > teamSize) {
                        teamArray[teamArray.length - 1].people.forEach(person => {
                            people.forEach(availablePerson => {
                                if (availablePerson == person) {
                                    people.splice(people.indexOf(person), 1)
                                }
                            })
                        })
                        makeTeam(currentLength - teamSize)
                    }
                }
                makeTeam(people.length)
                return teamArray // returns array of Objects, But THIS is not the one
            } else {
                return
            }
        }), teamSize)

        if (!team) {

        } else if (!Array.isArray(team) && allTeams.includes(team.people.toString())) {
            return
        } else if (Array.isArray(team)) {
            team.forEach(t => {
                allTeams.forEach(registeredTeam => {
                    if (t == registeredTeam) {
                        team.splice(team.indexOf(t), 1)
                    }
                })
            })
            for (let i = 0; i < team.length; i++) {
                allTeams.push(team[i].toString())
                const availableDate = await page.$eval("#AvailableDate", (availableDate => {
                    return availableDate.textContent.split("Sunday ").pop()
                }))
                team[i].time = availableDate
                allObjectTeams.push(team[i])
            }
                
            
        } else if (team.hasOwnProperty("people")) {
            allTeams.push(team.people.toString()) // this was changed to allTeams.push(team.toString())
            const availableDate = await page.$eval("#AvailableDate", (availableDate => {
                return availableDate.textContent.split("Sunday ").pop()
            }))
            team.time = availableDate
            allObjectTeams.push(team)
        } 
    }

    await browser.close()
    return allObjectTeams // This return statement returns undefined. THE OTHERS DO NOT
}

start().then((arr) => {
    console.log(arr)
})
    
Basel_Dev
  • 13
  • 3
  • It's a good idea to provide some context about what you're trying to do here. What data are you expecting? There is often a much simpler approach. – ggorlen Aug 27 '22 at 03:57
  • 3
    You have more than a dozen `return` statements. Which exact return statement are you asking about? You also have multiple loops so your description of the problem is confusing and incomplete. Please identify specific lines of code and describe a specific problem with those lines of code. Using general terms like "return" statement and "loop" when you have multiple of those is not being clear enough for us to understand what you're asking. – jfriend00 Aug 27 '22 at 04:26
  • @ggorlen Edits have been made. Apologies for not being clear – Basel_Dev Aug 27 '22 at 05:20
  • @jfriend00 Edits have been made, Apologies for not being clear – Basel_Dev Aug 27 '22 at 05:21
  • Does this answer your question? [Using async/await with a forEach loop](https://stackoverflow.com/questions/37576685/using-async-await-with-a-foreach-loop) – evolutionxbox Aug 27 '22 at 12:58

0 Answers0