目前我正在试图从与承诺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