承诺系列化

时间:2015-01-03 00:39:13

标签: javascript node.js promise q

我在使用Q和减少习语时连续运行多个场所时遇到问题(参见:http://taoofcode.net/promise-anti-patterns/

我试着按照这个例子,稍微改变一下,这就是我所拥有的:

playlist.createPlaylist('playlist')
.then(function(playlistId) {

    songsInfo.reduce(function (accumulatedPremise, songInfo) {
        accumulatedPremise.then(function (response) {
            var def = Q.defer();
            youtube.search(songInfo, function (songInfo, resp) {
                var song = songParser.parse(songInfo, resp);
                if (song !== null) {
                    playlist.addSongToPlaylist(song, playlistId).then(function(response) {
                        def.resolve(response)
                    })
                }
            });
            return def.promise;
        })}, Q());

});

现在,我应该谈谈这背后的主要观点:

1)我正在创建一个youtube播放列表。从createPlaylist函数,我将返回一个带有播放列表ID的promise,然后是

2)对于每个SongInfo,我需要在我的youtube模块上调用搜索方法。搜索功能也需要回调。在这种情况下,如果正确找到/解析了所需的歌曲,我正在调用addSongToPlaylistMethod。如您所见,addSongToPlaylist也返回一个Promise。

现在,问题是:

中的所有区块
then

方法,调用on accumulatedPremise 只执行一次。

你可能会问我为什么在这种情况下根本不使用forEach?好吧,因为 http://www.acnenomor.com/3037813p1/playlistitems-batch-insert-youtube-api-v3

你能帮我解决一下吗?

干杯, Slawek

1 个答案:

答案 0 :(得分:3)

你没有从reduce函数返回任何东西。

accumulatedPremise.then(function (response) {

应该是:

return accumulatedPremise.then(function (response) {