2013-04-29 71 views
0

我是JS的新手,我一直在嘗試使用Web Audio API實現一種混音器。我一直在閱讀關於JS範圍和實現「類」的不同方法,但顯然我還不完全理解它。 我有這soundClass對象,我希望它包含一個track對象的數組,我想push一個新的tracktracklist一旦解碼。但是,無論何時我console.logtracklist或每個track如下所示,第一個日誌(console.log('track name '+ that.track.name);)顯示正確的曲目名稱,但如果我嘗試記錄that.track對象本身,它總是顯示最後添加的曲目,因此如果我撥打soundClass.newTrack('track1.mp3')soundClass.newTrack('track2.mp3')console.log(soundClass.tracklist)我得到一個有兩個track2.mp3對象的數組。 我想這是一個範圍問題或異步解碼的問題,但我其實不知道,所以它可能只是一個愚蠢的錯誤。xmlhttprequest和Web Audio API的範圍問題?

對不起,如果這是一個非常基本的問題,但我會很感激任何幫助。

var soundClass = { 

audioContext: new webkitAudioContext, 
currentTime: 0, 
track: { 
    name: 0, 
    trackSource: null, 
    trackBuffer:null, 
    isLoaded: false, 
}, 
tracklist: [], 
newTrack: function(filename){ 
    var that=this;  
    var request =new XMLHttpRequest(); 
    request.open("GET",filename,true); 
    request.responseType="arraybuffer"; 
    request.onload=function(){ 
      that.audioContext.decodeAudioData(request.response,function(buffer){ 

       that.track.trackBuffer=buffer; 
       that.track.name=filename; 
       that.track.isLoaded=true; 
       that.track.trackSource=that.audioContext.createBufferSource(); 

       console.log('track name '+ that.track.name); 
       console.log(that.track); 

       that.tracklist.push(that.track); 

       }); 

    } 
    request.send(); 
}, 

回答

1

您只有一個對象soundclass.track。在request.onload函數內,您一次又一次地修改同一個對象。所以你的tracklist包含兩次相同的對象。你可以做的是

var track = {}; 
track.trackBuffer=buffer; 
... 
that.tracklist.push(track); 

並擺脫soundclass.track。

+0

謝謝!我真的很愚蠢的把'track'作爲一個字面值放在'soundclass'裏面。無論如何,我很好奇爲什麼會這樣。即使我正在覆蓋'track',我首先將它追加到'tracklist'數組中,所以數組應該沒問題?無論如何,再次感謝! – poeschl 2013-04-29 16:47:08

+0

陣列很好。如果它適合你,你會介意接受答案嗎? :) – zeroflagL 2013-04-29 17:46:43

+0

但是爲什麼tracklist的日誌輸出只是最後一個被添加了多少次newTrack被調用的對象呢? – poeschl 2013-04-29 17:59:19