Javascript xmlhttprequest和Web音频API的范围问题?
我是JS新手,我一直在尝试用Web音频API实现一种混音器。我已经读了一些关于JS的作用域和实现“类”的不同方法的书,但显然我还不太了解它。 我有一个Javascript xmlhttprequest和Web音频API的范围问题?,javascript,web-audio-api,Javascript,Web Audio Api,我是JS新手,我一直在尝试用Web音频API实现一种混音器。我已经读了一些关于JS的作用域和实现“类”的不同方法的书,但显然我还不太了解它。 我有一个soundClass对象,我希望它包含一组track对象,我希望解码后在tracklist上推送一个新的track。但是,每当我console.log如下所示的tracklist或每个track,第一个日志(console.log(track name'+that.track.name);)显示正确的曲目名称,但如果我尝试记录that.track对
soundClass
对象,我希望它包含一组track
对象,我希望解码后在tracklist
上推送一个新的track
。但是,每当我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();
},
您只有一个对象soundclass.track
。在request.onload
函数中,您一次又一次地修改同一对象。因此,您的轨迹列表
包含同一对象两次。你能做的就是
var track = {};
track.trackBuffer=buffer;
...
that.tracklist.push(track);
并摆脱soundclass.track。谢谢!,我真是太蠢了,竟然把音轨
作为文字放在soundclass
里面。但我很好奇为什么会这样。即使我正在覆盖轨迹
,我也会首先将其附加到轨迹列表
数组中,所以数组应该可以吗?无论如何,再次谢谢你!阵列很好。如果答案对你有用,你介意接受吗?:)但是,为什么tracklist的日志输出只是最后一个对象,其追加次数与调用newTrack的次数相同呢?只有一个对象。首先将其值设置为“track1.mp3”等,并将其添加到数组中tracklist[0]
指向值为“track1.mp3”的track
。然后更改该值并再次将其添加到数组中tracklist[1]
现在也指向track
,并且track
的值为“track2.mpg”<代码>曲目列表[0]
当然仍然指向曲目。而track
的值是。。。“track2.mp3”^^