目前我正在試圖從與承諾Spotify的API獲取數據,昨天我得到了另外一個問題很大的幫助,就同一主題:「Loop the object returned from node promise and feed to the next .then」。從節點返回數據有望
我所做的是首先從我的播放列表中獲取曲目,然後調用另一個獲取藝術家的api。最後,我打電話給另一個獲取藝術家圖像的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);
}
});
})
}
而這一次得到的藝術家形象:
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);
}
});
})
}
編輯編輯 我的方式cal及L這些功能是這樣的:
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
)
})
})
}));
它只返回的第一個結果 - 很明顯,因爲它只能通過foreach循環到達循環一次後,才「res.send()」,讓我怎麼確保它在我渲染視圖之前遍歷所有藝術家?我相信我必須做另一個Promise.all(),但我不確定在哪裏 - 有沒有人有想法?
我很感激:)
我仍然沒有弄清楚問題的解決方案是什麼,但我現在可以說的是,您不會在'artist.map()'函數內返回任何東西。另外,我沒有看到'array.push(obj [key])'中的'key'是什麼。 –
哦,是的,我忘了從測試中刪除變量鍵。我相信我必須做另一個Promise.all在某處讓我的藝術家圖像正確嗎? –
你能解釋一下數據和它的結構嗎?因爲用你的代碼告訴它很混亂。例如'getArtists'似乎會返回一個*(Promise of)*藝術家陣列陣列,而'getArtistImages'會返回一個'img'?持有包含實際圖像的*(可選)*圖像數組 – Thomas