私はこの問題を永遠に思えるものに固執しました。 私はちょうど私がやろうとしています何等のノードの約束から返されたオブジェクトをループして次のノードに送ります。
をノードに入る、との約束のまわりで私の頭を取得し始めていますが楽しんでるのAPIからデータを取得し、私が最初の事は自分のプレイリストを取得している。
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);
}
});
});
}
すべての権利は、これまでのところとても良いです。今、私はまた、これらのプレイリストからアーティストを取得したい:
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);
}
});
})
}
私は、このデータのすべてを返す方法は次のとおりです。
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);
})
しかし、これはundefinedを返します。私はgetArtists関数に単一のプレイリストurlを渡した場合にのみ動作させることができます。問題は、処理方法がわからないforEachループです。
ご協力いただきありがとうございます。
あなたのために、あなたは約束を返さないので、あなたのための約束はありません。 Bluebirdの約束を使用している場合、それはPromise.mapを持っています。あなたのforEachをこれに置き換えて、そのようなPromise.mapを返すようにしてください。 – Keith
約束どおりに読んだら、あなたのコード例では結局それをクリックしました。 – Ivan