我正在尝试将for循环参数i赋予内部闭包,因为我想识别我的解码音频(放在缓冲区内)。
此代码出错:e未定义。但是当删除()测试时,我的意思是测试等于所有结果的list.length,但我希望它们在调用时具有当前参数i的值。
for (var i = 0; i < list.length; i++) { //load in every url
requestArray.push(new XMLHttpRequest());
requestArray[i].open('GET', list[i].url, true);
requestArray[i].responseType = 'arraybuffer';
test = i;
requestArray[i].onload = (function (e) {
//Async method: ASK J
context.decodeAudioData(e.target.response, (function (buffer) { //Async method
console.log(test);
if (!buffer) {
alert('error decoding file data: ');
return;
}
})(test),
function (e) {
console.log('Error decoding audio file', e)
});
})(test);
requestArray[i].onerror = function () {
alert('BufferLoader: XHR error');
}
requestArray[i].send();
}
答案 0 :(得分:2)
for (var i=0; i<list.length; i++){
requestArray.push(new XMLHttpRequest());
requestArray[i].open('GET', list[i].url, true);
requestArray[i].responseType = 'arraybuffer';
requestArray[i].onload = (function (i) {
return function (resp) {
// i: index in requestArray
// resp: the response object passed when the onload event occurs
context.decodeAudioData(
resp.target.response,
(function(test) {
return function (buffer) {
console.log(test);
if (!buffer) {
alert('error decoding file data: ');
return;
}
}
}(i)),
function(e) { console.log('Error decoding audio file', e)}
);
}
}(i));
requestArray[i].onerror = function() {
alert('BufferLoader: XHR error');
}
requestArray[i].send();
}
请注意,对于要创建的闭包,函数必须返回一个函数。
这是一个关闭:
(function(){
var a = "b";
return function(){ alert(b); }
}());
如下所示,这是评估的结果:
(function(){
var a = "b";
}());
答案 1 :(得分:1)
您的代码无法满足您的要求。您不必将test
绑定为参数,而是立即使用参数test
调用匿名函数,并将其返回的结果作为参数传递给decodeAudioData
。我建议先修这个。例如。使用Function.prototype.bind。
答案 2 :(得分:1)
我想我会尝试这样的语法(我也会采用更模块化的方法,有几个声明的函数)
for (var i=0; i<list.length; i++){ //load in every url
requestArray.push(new XMLHttpRequest());
requestArray[i].open('GET', list[i].url, true);
requestArray[i].responseType = 'arraybuffer';
test = i;
requestArray[i].onload = (function(outerIndex){
return function (e) { //Async method: ASK J
context.decodeAudioData(e.target.response,
(function(index){
return function(buffer) { //Async method
console.log(index);
if (!buffer) {
alert('error decoding file data: ');
return;
}
};
})(outerIndex), function(e) { console.log('Error decoding audio file', e)});
};})(test);
requestArray[i].onerror = function() {
alert('BufferLoader: XHR error');
}
requestArray[i].send();
}
答案 3 :(得分:1)
当你把
})(test);
您在此时运行该功能(不是在事件发生时)通过e之类的测试。 我不明白“e未定义”e是我。
您是否可以尝试将“var”放在定义变量test的位置并删除“)(test)”?我认为问题在于测试范围。