Я новичок в JS, и я пытался реализовать своего рода звуковой микшер с 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. Я предполагаю, что это проблема области или проблема с асинхронным декодированием, но на самом деле я понятия не имею, так что это может быть просто какая-то глупая ошибка.
Извините, если это действительно простой вопрос, но я был бы признателен за любую помощь.
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();
},