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).