【发布时间】:2017-06-28 11:50:59
【问题描述】:
我目前正在尝试使用 Promise 从 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);
}
});
})
}
编辑编辑 我调用这些函数的方式是这样的:
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
)
})
})
}));
它只返回第一个结果 - 显然是因为它只在“res.send()”之前循环一次 forEach 循环,所以在渲染视图之前如何确保它循环通过所有艺术家?我相信我必须再做一次 Promise.all(),但我不确定在哪里 - 有人知道吗?
我很感激 :)
【问题讨论】:
-
我仍然没有弄清楚你的问题可能是什么解决方案,但我现在可以说的是你没有在
artist.map()函数中返回任何内容。另外,我没有看到array.push(obj[key])中的key是什么。 -
哦,是的,我忘了从测试中删除变量键。我相信我必须在某个地方再做一次 Promise.all 才能让我的艺术家图像正确?
-
你能解释一下数据和它的结构吗?因为通过你的代码告诉它很混乱。例如,
getArtists似乎返回一个 (Promise of) 艺术家数组,而getArtistImages返回一个img?持有一个 (可选) 图像数组,其中包含实际图像 -
没有实际数据很难测试,但似乎
getArtistsImages()只返回元素(或者你正在处理这样的事情)。另外,我认为第一个Promise.all()包装得太多了。我认为您需要另一个Promise.all()包围artists.map()来等待每个艺术家都被填充。 -
嗨,请检查编辑 - 在 Promise.all 中包装了 Artist.map
标签: javascript node.js