Javascript 具有顺序动态内容的并行承诺链
我无法解决如何将动态结果添加到承诺链中的问题,我已经到处找过了,如果这是可能的话。希望有人能澄清或给我一个很好的解决方案,我正在尝试完成以下示例(这是一个小型音乐播放器): 一些曲目列表的响应中有一个Javascript 具有顺序动态内容的并行承诺链,javascript,dynamic,promise,bluebird,sequential,Javascript,Dynamic,Promise,Bluebird,Sequential,我无法解决如何将动态结果添加到承诺链中的问题,我已经到处找过了,如果这是可能的话。希望有人能澄清或给我一个很好的解决方案,我正在尝试完成以下示例(这是一个小型音乐播放器): 一些曲目列表的响应中有一个next\u url,这意味着,我还应该获取属于曲目列表的下一个url,以便获得完整的tracklist.tracks。但是,这必须是连续的,因为我不知道响应中是否有后续的next\u url。当没有next\u url时,我就完成了一个曲目列表,可以对下一个曲目列表执行相同的操作(因此.map)
next\u url
,这意味着,我还应该获取属于曲目列表的下一个url,以便获得完整的tracklist.tracks
。但是,这必须是连续的,因为我不知道响应中是否有后续的next\u url
。当没有next\u url
时,我就完成了一个曲目列表,可以对下一个曲目列表执行相同的操作(因此.map
)
那么我的问题是,您如何在promises中实现这种动态内容链接?我知道您可以使用reduce
进行排序,但是在这种情况下next\u url
的数量不是固定的。我考虑过递归,但还没有找到一个好的例子来说明Promise.each
提前竖起大拇指。如果您创建了一个递归处理播放列表url的函数
var getPlaylistUrl = url =>
pfetch(url).then(playlist =>
playlist.next_url ? Promise.all([].concat.apply([playlist.tracks], getPlaylistUrl(playlist.next_url))) : playlist.tracks
);
您应该能够按照如下方式重写代码
pfetch('USER-API-URL')
.then(results => Promise.all(results.playlists.map(playlist => getPlaylistUrl(playlist.url))))
.then( playlists => {
// playlists should be complete
})
.then( () => console.log('finished,yay!') );
好。这种方法解决了问题,但是否有更优雅的解决方法,或者递归函数是唯一的方法?数据本质上是递归的,您需要通过它“递归”:p。“某种程度上解决了问题”是什么意思?它是否能给你你想要的结果?是的,但在
{results:[result.tracks][result.tracks][result.tracks][result.tracks,][result.tracks,][result.tracks,][]]]}
中需要将其展平,但你的解决方案确实在我接受答案的待办事项列表中。如果你不介意的话,再问一个问题。如果我在第二个中有数据,那么(…)
承诺,有没有办法告诉第一个。然后(…)
关于结果,或者承诺不允许这样做?我仍然希望这是一种“美丽”的方式(说是完美主义者)。是什么阻碍了我去测试它。非挥发性物质。。。接受。我只更改了一行,我认为这将解决结果中的“嵌套”
pfetch('USER-API-URL')
.then(results => Promise.all(results.playlists.map(playlist => getPlaylistUrl(playlist.url))))
.then( playlists => {
// playlists should be complete
})
.then( () => console.log('finished,yay!') );