var context = new webkitAudioContext();
var url = [ "/foo.mp3"];
function init(callback) {
var req = new XMLHttpRequest();
var audioBuffers = [];
for(var i = 0; i < url.length; i++) {
req.open("GET", url[i], true);
req.responseType = "arraybuffer";
req.onload = function() {
context.decodeAudioData(req.response, function(buffer) {
//blah blah push buffer into an array
});
req.send();
}
if(callback) callback(audioBuffers);
}
这很好用,不要误会我的意思。问题是,我希望它同步加载而不是异步加载。
req.open("GET", url[i], true)
最后一个参数是您声明它是否同步的地方。出于某种原因,当我将其设为false时,您无法将其responseType更改为arraybuffer。
这会破坏方法,因为它不是数组缓冲区,无法读取响应。并且是令人惊讶的自然行为。
context.decodeAudioData(req.response, function(buffer){});
我对此进行了一些研究,但我只找到了将字符串转换为数组缓冲区的方法。 在这种情况下,我将音频(如mp3格式)转换为数组缓冲区,同时保持请求同步。 有没有解决方法呢?
答案 0 :(得分:0)
从标准方面来看。有传言说(可能是正确的)同步请求将在未来的规范中被删除。新功能并不支持它。检查this message。
最近更改了XMLHttpRequest2规范,禁止在设置xhr.responseType时发送同步请求。
此处the spec:
如果 async为false ,则存在关联的XMLHttpRequest文档,且timeout属性值不为零,withCredentials属性值为true,或responseType属性值不为空string ,抛出&#34; InvalidAccessError&#34;异常并终止这些步骤。
从应用程序方面。使用ArrayBuffer
通常意味着您请求的资源在某种程度上是一个大二进制文件。虽然同步请求会阻止UI,但用户体验非常糟糕。所以,即使你可以这样做,也不是一个好主意。