Percorrendo um loop for e chamando uma função JS

Aug 19 2020

Portanto, não posso optar por enviar ao carteiro mais de um objeto. quando eu console.log, eu recebo todos os objetos do array (battletags que eu tirei e substituí pelo jogador)

        router.get('/cod/', (req, res) => {
        const pdata = {}
        console.log(req.params)
        API.login(process.env.EMAIL, process.env.PASSWORD).then((output) => {
       
        // Players array,
        players = ['player1', 'player2', 'player3']
        // map through array and create promise for each player and store it in an array
        promises = players.map(player => API.MWBattleData(player))
        // Pass all promises to Promise.all
        // Result will be an array of individual output of each promise
        Promise.all(promises)
            .then(result => {
                // Loop through result, and assign the output to pdata
                result.forEach((output, index) => {
                    // index + 1 because starting index will be zero
                    pdata[`p${index + 1}`] = output
                    res.json(pdata);
                })
            })
         })
         });

Este erro originou-se jogando dentro de uma função assíncrona sem um bloco catch ou rejeitando uma promessa que não foi tratada com .catch(). Para encerrar o processo do nó na rejeição de promessa não tratada, use o sinalizador CLI--unhandled-rejections=strict(consulte https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (ID da rejeição: 1) (nó:19134) [DEP0018] DeprecationWarning: As rejeições de promessas não tratadas estão obsoletas. No futuro, as rejeições de promessa que não forem tratadas encerrarão o processo Node.js com um código de saída diferente de zero.

Respostas

1 Kumar Aug 19 2020 at 10:05

Parece que API.MWBattleData('Player1')retorna uma promessa. Então você pode conseguir isso via Promise.all, que resolverá todas as promessas sequencialmente e retornará uma matriz de resultados para todas as promessas

// Players array,
players = ['player1', 'player2', 'player3', ...]

// map through array and create promise for each player and store it in an array
promises = players.map(player => API.MWBattleData(player))

// Pass all promises to Promise.allSettled
Promise.allSettled(promises)
  .then(result => { // Result will be an array of individual output of each promise

    // Loop through result, and assign the output to pdata
    result.forEach((output, index) => { 
      // index + 1 because starting index will be zero
      pdata[`p${index + 1}`] = output.value;
    })
  })

Deixe-me saber se isso funciona para você

elpmid Aug 19 2020 at 10:05

Você pode usar o método promise.all() para criar uma promessa iterável que resolva uma matriz dos resultados que a entrada promete. Veja os documentos: Promise.all()

Eu deduzo que você tem uma matriz de usuários.

const players = [player1, player2, player3];

Para criar uma entrada de promessa a partir deles, você pode fazer assim usando o método array.map que retorna um array.

Promise.all(players.map(player => API.MWBattleData(player))).then(values => console.log(values))

Os valores retornados são uma matriz de saída pelas promessas criadas a partir da matriz de jogadores. Espero que ajude. Felicidades