Обещания: Resolve возвращает значение слишком рано - PullRequest
0 голосов
/ 22 января 2019

UPDATE: Источником моей проблемы было то, что я присваивал значения своему массиву по их uuid. так что викторина [uuid] = х. Следовательно, длина массива равна 0, и свойство, очевидно, не обрабатывается в ответе json.

Я создаю функцию, в которой я инициализирую тест объекта и изменяю его в цикле for. Когда я закончу, я хочу выполнить обещание. Когда я вызываю эту функцию, я получаю только инициализированные значения и мне не хватает изменений из цикла for. console.log (викторина) регистрирует объект с изменениями. Я не могу найти свою ошибку ...

Я пытался использовать некоторые условия if, чтобы вызывать функцию разрешения только после завершения цикла for. Это привело либо к тому же результату, либо к отсутствию ответа.

app.get('/playQuiz', function (req, res) {
    playQuiz().then(data => {
        res.status(200).json({
            quiz: data
        });
    });    
});

async function playQuiz(){
    var players = {
        puuids: [],
        stats: []
    }
    credentials = await getCredentials();

    token = credentials.token;
    port = credentials.port;

    players.puuids = await getLobby(port, token);
    for(i=0; i<players.puuids.length; i++){
        players.stats[i] = await getStats(port, token, players.puuids[i])
    }

    let quiz = await evaluateQuiz(players)
    console.log(quiz); // This displays the object quiz with the changes from the loop
    return quiz; //The response i get displayed in Postman from this line, does not show the changes in i.e. csScore. It only shows an empty array.
}

function evaluateQuiz(players){
    return new Promise((resolve, reject) => {
        var quiz = [{
                questionId: 1,
                question: "Who has the most cs per game?",
                csScore: []
            },
            {
                questionId: 2,
                question: "Who has the highest vision score per game?",
                vsScore: []
            },
            {
                questionId: 3,
                question: "Who has the best win rate?",
                winRate: []
            },
            {
                questionId: 4,
                question: "Who has the most quadra kills?",
                quadraKills: []
            },
            {
                questionId: 5,
                question: "Who has the highest objective participation?",
                objectiveRate: []
            }
        ]

        for(var i=0; i<players.puuids.length; i++){
            quiz[0].csScore[players.puuids[i]] = players.stats[i].csScore /    players.stats[i].gamePlayed;
            quiz[1].vsScore[players.puuids[i]] = players.stats[i].visionScore / players.stats[i].gamePlayed;
            quiz[2].winRate[players.puuids[i]] = players.stats[i].victory / players.stats[i].gamePlayed;
            quiz[3].quadraKills[players.puuids[i]] = players.stats[i].quadraKills / players.stats[i].gamePlayed;
            quiz[4].objectiveRate[players.puuids[i]] = players.stats[i].objectiveTakenInvolved / players.stats[i].gamePlayed;
        }
        //console.log(quiz);
        resolve(quiz);        
    })
};

1 Ответ

0 голосов
/ 22 января 2019

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

Это будет решением для вашего кода,добро пожаловать в StackOverflow и счастливого кодирования!

function evaluateQuiz(players) {
    const quiz = [{ ...}]

    for (var i = 0; i < players.puuids.length; i++) {
        // Doing some object changes in this loop like: 
        quiz[0].csScore[players.puuids[i]] = players.stats[i].csScore / players.stats[i].gamePlayed;
    }
    return quiz;
};

Прочтите статью, чтобы лучше понять использование Обещаний

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...