私は現在Spotify APIから約束したデータを取得しようとしていますが、昨日は同じトピックに関する別の質問について大きな助けを得ました: "Loop the object returned from node promise and feed to the next .then"ノードの約束からのデータ返信
私がしていることは、まず自分のプレイリストからトラックを取得してから、アーティストを取得する別のAPIを呼び出します。最後に、アーティストの画像を取得する別のAPIを呼び出します。 私の質問は、私が約束したデータをどのように返すのですか?
これは、プレイリストのURLを取得する私の関数である。
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);
}
});
});
}
この1つは、アーティストを取得:
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);
}
});
})
}
をそして、この1は、アーティスト画像取得:
function getArtistImages(artistId) {
var options = {
url: 'https://api.spotify.com/v1/artists/' + artistId,
json: true
};
return new Promise(function(resolve, reject) {
request.get(options, function(error, response, body) {
if(error != null) {
reject(error);
} else {
resolve(body);
}
});
})
}
をEDIT EDIT 私はカールリットルこれらの関数は、このようなものです: - それは唯一の前に、一度foreachループをループになっているため「(res.send)」は明らかなので、どのように私はそれを確認してください
getPlaylists(access_token)
.then(playlists => Promise.all(playlists.map(playlist =>
getArtists(playlist, access_token)))
.then(artists => {
artists.map(artist => {
artist.map(a => {
console.log(a);
let component = renderToString(
<App>
<Table artists={a} />
</App>
);
res.send(
component
)
})
})
}));
それだけで最初の結果を返します。ビューをレンダリングする前に、すべてのアーティストをループしますか?私は別のPromise.all()をやらなければならないと信じていますが、誰が考えを持っているのかは分かりません。
私はそれを感謝:)
あなたの質問の解決策が何であるかはまだ分かりませんでしたが、私が今言うことができるのは、 'artist.map()'関数の中に何も返さないということです。また、 'array.push(obj [key])'に 'key 'が何か見えませんでした。 –
はい、変数キーをテストから削除するのを忘れました。私は別のプロミスをやらなければならないと信じています。 –
データとその構造について説明できますか?あなたのコードで伝えるのはとても混乱しているからです。 'getArtists'は' * '(Promise of)配列の配列を返しますが、 'getArtistImages'は' img'を返します。 *(オプション)* images配列には実際の画像が含まれています – Thomas