2012-09-19 44 views
0

我有一個軌道模型和軌道集合。該模型本身具有播放單曲的功能play()。當單個軌道(按列表順序)完成時,該集合應該能夠逐一播放每個軌道。骨幹foreach等待

型號:

app.Track = Backbone.Model.extend({ 
    defaults: {...}, 
    initialize: {...}, 
    play: function(playlist) { 
     if(finished && playlist) { 
      Backbone.pubSub.trigger('finishedPlaybackLoadNext') 
     } else { 
      Backbone.pubSub.trigger('finishedPlayback') 
     } 
    }, 
}) 

收藏:

var TrackList = Backbone.Collection.extend({ 
    model: app.Track, 
    nextOrder: function() {...}, 
    comparator: function(track) {...}, 
    playAll: function() { 
     this.models.forEach(function(item) { 
      item.play(true); //true = play as playlist 
     }); 
    } 
}) 

正如預期的那樣在foreach不等到該劇在列表中的每個單獨的模型來完成。我該如何實現這種等待?

編輯:我正在使用全局觸發器/用戶事件在不同視圖中共享它們。

Backbone.pubSub = _.extend({}, Backbone.Events); 

回答

1

我覺得你應該有兩種模式來連續播放歌曲。首先你有一個Track模型和它相應的TrackList集合,但是你會有另一個稱爲PlayList的模型和一個集合。

Track的播放函數應該接受另一個參數,這個參數是Track完成播放時必須執行的回調。通過這種方式,您也可以在PlayList上播放一個播放功能,並且此功能可以處理通過嵌套回調播放所有歌曲(聽起來像遞歸的樂趣:P)。

編輯:我繼續前進,並且破解了我所想的一些小實現。我在這裏沒有使用Backbone,但是我相信你可以適應這個想法,如果你有一些回調函數傳遞給歌曲播放功能的話(順便說一下......你是怎麼演奏你的歌曲的?) 。

Song = function(name) { 
    var play = function() { 
    console.log(name); 
    sleep(1000); 
    }; 

    this.name = name; 
    this.play = function(cb) { 
    play(); 
    if (typeof cb == "function") { 
     cb.call(this); 
    } 
    }; 
}; 

PlayList = function(songs) { 
    this.play = function(cb) { 
    // define a function that calls the first song with a callback 
    // that calls the next song with a callback that calls the next 
    // ... untill the last songs play function gets called with cb 
    // (parameter top this function) as the callback. 
    var playFirstSong = _.reduce(songs.reverse(), function(cb, song) { 
     return function() { 
     song.play(cb); 
     }; 
    }, cb); 

    playFirstSong(); 
    }; 
}; 

我做了一個jsFiddle也是這樣。