gpt4 book ai didi

javascript - 循环从 node promise 返回的对象并提供给下一个 .then

转载 作者:搜寻专家 更新时间:2023-10-31 23:41:09 25 4
gpt4 key购买 nike

我似乎已经被这个问题困扰了很久。我刚刚进入 Node ,并开始了解 promises 等。

我想做的是从 Spotify 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);
})

但是,这将返回未定义的。如果我将单个播放列表 url 传递给 getArtists 函数,我只能让它工作 - 问题是我不知道如何处理的 forEach 循环。

非常感谢任何帮助!

最佳答案

您可以结合使用 [].map()Promise.all() 来创建一个等待一系列操作完成的 Promise:

getPlaylists(access_token)
.then(playlists => Promise.all(playlists.map(playlist =>
getArtists(playlist, access_token)))
.then(artists => {
// use here
});

请记住,要链接 Promise,您必须从 .then() 处理程序返回一个值或 Promise。 .forEach() 总是返回 undefined,无论如何。

首先,我们使用 .map()getArtist 将播放列表数组转换为 Promise 数组,然后我们将该 Promise 数组传递给 Promise.all(),它返回单个 Promise,它在数组中的所有 Promise 都解析时解析(或在第一个拒绝时拒绝)。

关于javascript - 循环从 node promise 返回的对象并提供给下一个 .then,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39800325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com