stopListening()竞争条件?

var PlaylistView = Backbone.View.extend({ el: '#expanded-container', initialize: function() { var playlistModel = this.model; this.stopListening(playlistModel.get('songs'), 'add'); var form = this.$('input'); $(form).keypress(function (e) { if (e.charCode == 13) { console.log("hey") var query = form.val(); playlistModel.lookUpAndAddSingleSong(query); } }); this.listenTo(playlistModel.get('songs'), 'add', function (song) { var songView = new SongView({ model: song }); this.$('.playlist-songs').prepend(songView.render().el); }); 

这是我的Backbone视图的片段,我无法弄清楚为什么有时同一个songView呈现两次。 在其他视图中,我手动调用PlaylistView.initialize()而不重新创建视图。 因此,我在初始化开始时取消注册所有事件,以防止它多次侦听同一事件。 它完成了它的工作但只是偶尔一次,同一个songView呈现两次。 我怀疑这可能是某种竞争条件,但我无法弄清楚原因。 有没有人有想法?

如果playlistModel.get('songs')没有返回相同的对象,可能会发生这种情况,尝试只删除对象所在的事件,如下所示:

 this.stopListening(null, 'add');