我是JS的新手,我一直在嘗試使用Web Audio API實現一種混音器。我一直在閱讀關於JS範圍和實現「類」的不同方法,但顯然我還不完全理解它。 我有這soundClass
對象,我希望它包含一個track
對象的數組,我想push
一個新的track
tracklist
一旦解碼。但是,無論何時我console.log
tracklist
或每個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();
},
謝謝!我真的很愚蠢的把'track'作爲一個字面值放在'soundclass'裏面。無論如何,我很好奇爲什麼會這樣。即使我正在覆蓋'track',我首先將它追加到'tracklist'數組中,所以數組應該沒問題?無論如何,再次感謝! – poeschl 2013-04-29 16:47:08
陣列很好。如果它適合你,你會介意接受答案嗎? :) – zeroflagL 2013-04-29 17:46:43
但是爲什麼tracklist的日誌輸出只是最後一個被添加了多少次newTrack被調用的對象呢? – poeschl 2013-04-29 17:59:19