Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有顺序动态内容的并行承诺链_Javascript_Dynamic_Promise_Bluebird_Sequential - Fatal编程技术网

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!') );