una termine tablas tabla que funcion esperar ejemplos datos con agregar javascript node.js promise

javascript - termine - Pasa el objeto devuelto de la promesa del nodo y pasa al siguiente.



removechild javascript (1)

He estado atascado con este problema por lo que parece ser una eternidad. Me estoy metiendo en el nodo y estoy empezando a entender las promesas, etc.

Lo que trato de hacer es buscar datos de la API de Spotify, y lo primero que hago es obtener mis propias listas de reproducción:

function getPlaylists(access_token) { var options = { url: ''https://api.spotify.com/v1/me/playlists'', headers: { ''Authorization'': ''Bearer '' + access_token }, json: true }; return new Promise(function(resolve, reject) { request.get(options, function(error, response, body) { var playlists = body.items; var playlistArray = []; playlists.forEach(function(playlist) { var name = playlist.name; var url = playlist.tracks.href; playlistArray.push(url); }); if(!error) { resolve(playlistArray); } else { reject(error); } }); }); }

Está bien, hasta ahora todo bien. Ahora también quiero buscar a los artistas de estas listas de reproducción:

function getArtists(url,access_token) { var params = { url: url, headers: { ''Authorization'': ''Bearer '' + access_token }, json: true }; return new Promise(function(resolve, reject) { request.get(params, function(error, response, body) { var tracks = body.items; var artistArray = []; tracks.forEach(function(artists) { let allArtists = artists.track.artists; allArtists.forEach(function(artist) { artistArray.push(artist); }); }) if(!error) { resolve(artistArray); } else { reject(error); } }); }) }

La forma en que devuelvo todos estos datos es:

getPlaylists(access_token) .then(function(playlists) { playlists.forEach(function(playlist) { getArtists(playlist,access_token) .then(function(artist) { return artist; }); }); }).then(function(artists) { console.log("getting artists",artists); }).catch(function(error) { console.log(error); })

Sin embargo, esto devuelve indefinido. Solo puedo hacer que funcione si paso una url de lista de reproducción a la función getArtists; el problema es el ciclo forEach que no sé cómo manejar.

¡Cualquier ayuda es muy apreciada!


Puede usar una combinación de [].map() y Promise.all() para realizar una Promesa que espera la finalización de una serie de acciones:

getPlaylists(access_token) .then(playlists => Promise.all(playlists.map(playlist => getArtists(playlist, access_token))) .then(artists => { // use here });

Recuerde, para Promesas para encadenar debe devolver un valor o una Promesa de su controlador .then() . .forEach() siempre devuelve undefined , no importa qué.

Primero, convertimos el conjunto de listas de reproducción en un conjunto de promesas usando .map() con getArtist , luego pasamos ese conjunto de promesas a Promise.all() , que devuelve un Promise único que se resuelve cuando todas las promesas del arreglo se resuelven (o rechaza cuando el primer rechaza).