将从节点promise返回的对象循环到下一个.then
Loop the object returned from node promise and feed to the next .then
我已经被这个问题困住了,似乎是永恒的。我刚刚进入node,开始思考承诺等问题。
我想做的是从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);
})
然而,这返回undefined。我只能使它工作,如果我在一个单一的播放列表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
});
记住,对于承诺链,你必须从.then()
处理程序返回一个值或承诺。.forEach()
总是返回undefined
,无论什么
首先,我们通过使用.map()
和getArtist
将playlist数组转换为Promise数组,然后我们将该Promise数组传递给Promise.all()
,它返回一个Promise,当数组中的所有Promise都解析时(或者当第一个Promise拒绝时),该Promise将解析。
相关文章:
- 每第n个图像具有下一个循环的余数偏移
- 在每个循环上完成异步调用,然后转到下一个节点 js
- Jquery下一个和上一个按钮循环函数
- 将i from循环与下一个值进行比较
- 如何使用上一个/下一个功能循环数组中的图像
- 上一个和下一个箭头不会循环
- jQuery 循环 如果只有一张幻灯片,则隐藏上一个/下一个导航
- 循环遍历 Angular HTTP 请求中的对象,等到响应后再运行下一个循环
- 如何使用上一个/下一个按钮循环浏览图像
- 在循环中使用 q promise 的最佳方法是什么?等待链完成,然后再迭代到下一个
- 添加上一页下一个导航到列表项淡入/淡出循环
- 尝试创建一个简单的 JavaScript 库,其中包含下一个和上一个按钮以循环回开头
- JavaScript循环等待一些函数返回,然后执行下一个循环
- Jquery - 在每个循环中查找下一个元素
- "下一个“;按钮并没有按预期循环浏览答案
- 在元素之间循环,然后将类更改为下一个类
- settimeout正在阻塞事件循环Nodejs检查下一个示例:
- 在jQuery中,有一种方法可以在数组上循环,这样在循环到下一个循环之前,它首先等待来自服务器的响应
- 使用Titanium,我想在点击下一个按钮后,通过1乘1的数组循环,并使用上一个按钮向后循环
- AJAX-等待数据追加,然后循环下一个