2 votes

Retourner Promise.all depuis une fonction

J'essaie de retourner une promesse avec Promise.all mais pour une raison quelconque, mes valeurs .then sont évaluées comme indéfinies. Cela semble fonctionner lorsque tout est en ligne, mais j'avais cru comprendre que je devais pouvoir renvoyer la promesse.all supérieure et la traiter comme n'importe quelle autre promesse.

function createStreamerArray() {
  const regularStreamers = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"]
  const baseURL = 'https://wind-bow.gomix.me/twitch-api'

  return Promise.all(
    regularStreamers.map(streamer => {
      Promise.all([
        Promise.resolve($.getJSON(baseURL + '/users/' + streamer + '?callback=?', null)),
        Promise.resolve($.getJSON(baseURL + '/streams/' + streamer + '?callback=?', null)) 
      ]).then(values => {
        return values
      })
    })
  )
}

createStreamerArray().then(values => console.log(values))

1voto

Jaromanda X Points 12007

Tout d'abord (et surtout), vous devez renvoyer une valeur dans la fonction .map rappel

Cela peut se faire de la manière suivante

regularStreamers.map(streamer => {
  // added return
  return Promise.all([
    Promise.resolve($.getJSON(baseURL + '/users/' + streamer + '?callback=?', null)),
    Promise.resolve($.getJSON(baseURL + '/streams/' + streamer + '?callback=?', null)) 
  ])
})

Ou, en utilisant la forme courte pour les fonctions de flèche, comme ceci

//                               { removed
regularStreamers.map(streamer => 
  Promise.all([
    Promise.resolve($.getJSON(baseURL + '/users/' + streamer + '?callback=?', null)),
    Promise.resolve($.getJSON(baseURL + '/streams/' + streamer + '?callback=?', null)) 
  ])
)
// } removed

Deuxièmement, (uniquement pour supprimer le code non requis), supprimez la redondance de l'option

.then(values => {
    return values
})

Cela se traduit par :

    function createStreamerArray() {
        const regularStreamers = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"];
        const baseURL = 'https://wind-bow.gomix.me/twitch-api';

        return Promise.all(regularStreamers.map(streamer => Promise.all([
              Promise.resolve($.getJSON(baseURL + '/users/' + streamer + '?callback=?', null)),
              Promise.resolve($.getJSON(baseURL + '/streams/' + streamer + '?callback=?', null)) 
        ])));
    };
    createStreamerArray().then(values => console.log(values));

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Ce qui, vous le verrez, fonctionne

0voto

Turnipdabeets Points 2448

Avez-vous essayé d'ajouter un retour supplémentaire dans votre fonction map ? Si vous ne retournez pas la deuxième Promise.all, vous ne verrez pas vos valeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X