Eseguire il ciclo di un ciclo for quindi chiamare una funzione JS

Aug 19 2020

Quindi non riesco a farlo optare per postino più di un oggetto. quando lo console.log ottengo tutti gli oggetti dell'array (battletag che ho tolto e sostituito con player)

        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);
                })
            })
         })
         });

Questo errore è stato originato lanciando all'interno di una funzione asincrona senza un blocco catch o rifiutando una promessa che non è stata gestita con .catch(). Per terminare il processo del nodo in caso di rifiuto della promessa non gestito, utilizzare il flag CLI--unhandled-rejections=strict(vedi https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1) (node:19134) [DEP0018] DeprecationWarning: i rifiuti di promessa non gestiti sono deprecati. In futuro, le promesse rifiutate che non vengono gestite termineranno il processo Node.js con un codice di uscita diverso da zero.

Risposte

1 Kumar Aug 19 2020 at 10:05

Sembra che API.MWBattleData('Player1')restituisca una promessa. Quindi puoi raggiungere questo obiettivo tramite Promise.all, che risolverà tutte le promesse in sequenza e ti restituirà una serie di risultati per tutte le promesse

// 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;
    })
  })

Fammi sapere se per te va bene

elpmid Aug 19 2020 at 10:05

È possibile utilizzare il metodo promise.all() per creare una promessa iterabile che risolve un array dei risultati promessi dall'input. Vedi documenti: Promise.all()

Deduco che hai una serie di utenti.

const players = [player1, player2, player3];

Per creare un input di promessa da essi puoi farlo in questo modo usando il metodo array.map che restituisce un array.

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

I valori restituiti sono un array di output delle promesse create dall'array dei giocatori. Spero possa essere d'aiuto. Saluti