Пн goose exe c () не ожидает должным образом - PullRequest
0 голосов
/ 03 августа 2020

По какой-то причине exe c () не ожидает в моем коде:

    let team = <SOME TEAM NAME> //putting manually for testing
    let results = []

    TeamModel.find({ name: team })
        .exec(async (err, docs) => {
            if (err)
                return res.send(Response("failure", "Error occured while retrieving fixtures"))
            
            for(let i = 0; i < docs.length; i++){

                let doesExist = await FixtureModel.exists({ leagueName: docs[i].leagueName })

                if (doesExist) {
                    let query = FixtureModel.find({ leagueName: docs[i].leagueName, $or: [{ homeTeam: team }, { awayTeam: team }] })
                    await query.exec((err2, docs2) => {
                        if (err2)
                            return res.send(Response("failure", "Error occured while retrieving fixtures"))

                        docs2.forEach((doc2, index) => {results.push(doc2.toObject())})
                        console.log('during await') //Executes second
                    })

                    console.log('after await') //Executes first
                }
                else { //This section is not required
                    let result = await Communicator.GetFixturesFromLeague(docs[i].leagueId)

                    result.api.fixtures.forEach((fixture, index) => {
                        let newFixture = new FixtureModel({
                            fixtureId: fixture.fixture_id,
                            leagueId: fixture.league_id,
                            leagueName: fixture.league.name,
                            eventDate: fixture.event_date,
                            statusShort: fixture.statusShort,
                            homeTeam: fixture.homeTeam.team_name,
                            awayTeam: fixture.awayTeam.team_name
                        })

                        newFixture.save()
                        results.push(newFixture.toObject())
                    })                    
                }          
            }

            console.log(results)
            res.send(Response("success", "Retrieved fixtures", results))
        })

, и результат выглядит примерно так:

after await
[]
during await

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

1 Ответ

0 голосов
/ 04 августа 2020

Это обходной путь, если кому-то интересно. Отправка ответа внутри обратного вызова exe c (), когда forL oop завершается, минуя необходимость в async / await.

 if (doesExist) {
                    let query = FixtureModel.find({ league_name: docs[i].leagueName, $or: [{ homeTeam: { team_name: team} }, { awayTeam: { team_name: team} }] })
                    await query.exec((err2, docs2) => {
                        if (err2)
                            return res.send(Response("failure", "Error occured while retrieving fixtures"))

                        docs2.forEach((doc2, index) => {results.push(doc2.toObject())})
                        
                        if(i + 1 == docs.length){
                            return res.send(Response("success", "Retrieved fixtures", results))
                        }
                    })
                }
...