0

我是 JS 的新手,我一直在尝试使用 Web Audio API 实现一种混音器。我一直在阅读一些关于 JS 的范围和实现“类”的不同方法的内容,但显然我还不太了解它。我有这个soundClass对象,我希望它包含一个track对象数组,并且我想在它解码后立即添加push一个新对象。但是,每当我如下所示时,第一个日志(tracktracklistconsole.logtracklisttrackconsole.log('track name '+ that.track.name);that.tracksoundClass.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();
},
4

1 回答 1

1

你只有一个对象soundclass.track。在request.onload函数中,您一次又一次地修改同一个对象。所以你tracklist包含两次相同的对象。你能做的是

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

并摆脱 soundclass.track。

于 2013-04-29T15:01:32.323 回答