gpt4 book ai didi

javascript - 在没有 jQuery 的情况下修复 AJAX 加载文件两次问题

转载 作者:行者123 更新时间:2023-11-30 19:29:48 25 4
gpt4 key购买 nike

我正在开发一个简单的 Web 应用程序,它需要加载 16 个音频文件来处理听力测试。但是我的代码加载文件两次!

应用程序需要非常轻便和快速,所以这是一个大问题。

出于同样的原因,我不想使用 jQuery 库。

function loadSound(array) {
var i = 0;
array.forEach(function(soundUrl) {
var request = new XMLHttpRequest();
request.open('GET', soundUrl, true);
request.responseType = 'arraybuffer';

request.onloadend = function() {
var audioData = request.response;

contextAudio.decodeAudioData(audioData, function(buffer) {
sources[i] = contextAudio.createBufferSource();
sources[i].buffer = buffer;
sources[i].connect(contextAudio.destination);
i++
});
};
request.send(null);
});
}

soundList 数组和 loadSound 调用:

var soundList = new Array(
'http://localhost/testauditif/sons/440L.wav',
'http://localhost/testauditif/sons/440R.wav',
'http://localhost/testauditif/sons/125L.wav',
'http://localhost/testauditif/sons/125R.wav',
'http://localhost/testauditif/sons/250L.wav',
'http://localhost/testauditif/sons/250R.wav',
'http://localhost/testauditif/sons/500L.wav',
'http://localhost/testauditif/sons/500R.wav',
'http://localhost/testauditif/sons/1000L.wav',
'http://localhost/testauditif/sons/1000R.wav',
'http://localhost/testauditif/sons/2000L.wav',
'http://localhost/testauditif/sons/2000R.wav',
'http://localhost/testauditif/sons/4000L.wav',
'http://localhost/testauditif/sons/4000R.wav',
'http://localhost/testauditif/sons/8000L.wav',
'http://localhost/testauditif/sons/8000R.wav'
);

loadSound(soundList);

JavaScript 控制台: XHRGEThttp://localhost/testauditif/sons/440L.wav [HTTP/1.1 200 正常 0 毫秒]

XHRGEThttp://localhost/testauditif/sons/440R.wav
[HTTP/1.1 200 OK 0ms]

0 script.js:88:12
XHRGEThttp://localhost/testauditif/sons/125L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/125R.wav
[HTTP/1.1 200 OK 0ms]

0 script.js:88:12
XHRGEThttp://localhost/testauditif/sons/250L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/250R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/500L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/500R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/1000L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/1000R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/2000L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/2000R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/4000L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/4000R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/8000L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/8000R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/440L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/440R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/125L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/125R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/250L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/250R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/500L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/500R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/1000L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/1000R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/2000L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/2000R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/4000L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/4000R.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/8000L.wav
[HTTP/1.1 200 OK 0ms]

XHRGEThttp://localhost/testauditif/sons/8000R.wav
[HTTP/1.1 200 OK 0ms]

最佳答案

关闭!!!

让我们仔细看看您的代码发生了什么。

您开始迭代数组,每个 URL 在 array.forEach(function(soundUrl) {}) 中定义为 soundUrl。请注意,变量 i 保留在此匿名函数中,因为它是在 loadSound 函数中定义的。

您使用 request.send(null); 发送您的请求。在 request.onloadend 函数中,i 值为 0。到目前为止一切正常。

麻烦来了。无需等待 onloadend 被调用,您将移动到 forEach 循环中的下一个 soundUrl。当 request.onloadend 被初始化时,i 的值仍然是 0,除非上一个请求的 onloadend 已经被调用。 (假设音频文件需要一段时间才能下载到浏览器,这是极不可能的)

在您的 forEach 循环中间的某个地方,request.onloadend 被调用以获取您递增 i 的第一个请求。

最终结果?您最终会在 sources 数组中得到一堆垃圾,其中很少有文件被下载,很少有文件被下一个音频文件覆盖,中间有空洞。

PS:就目前的代码而言,它不起作用。这是真正的问题吗?或许。没有关于 array 包含的内容以及代码向后端发送了多少请求的更多信息。


我建议的解决方案。

function loadSound(array) {
array.forEach(function(soundUrl, i) {
// No need to declare var i for iteration. Foreach provides the index.
var request = new XMLHttpRequest();
// Creating an instance of XMLHttpRequest inside loop to ensure
// request.onloadend does not get overriden in the next iteration.
request.open('GET', soundUrl, true);
request.responseType = 'arraybuffer';

request.onloadend = function() {
// Retain i inside the function using a local variable inside the callback function.
var idx = i;
var audioData = request.response;

contextAudio.decodeAudioData(audioData, function(buffer) {
// Not sure whether decodeAudioData in asyc. If so, you again need to retain idx inside the callback.
var src_idx = idx;
sources[src_idx] = contextAudio.createBufferSource();
sources[src_idx].buffer = buffer;
sources[src_idx].connect(contextAudio.destination);
});
};
request.send(null);
});
}

关于javascript - 在没有 jQuery 的情况下修复 AJAX 加载文件两次问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56536757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com