2014-12-02 38 views
1
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); 

} 

這工作正常,不要誤解我的意思。事情是,我希望它同步而不是異步加載。如何使用同步ajax請求將音頻轉換爲數組緩衝區?

req.open("GET", url[i], true) 

最後一個參數是聲明它是同步還是不同步的地方。出於某種原因,當我將其設置爲false時,您無法將其responseType更改爲arraybuffer。

然後,它破壞了該方法,因爲它不是一個數組緩衝區,也無法讀取響應。令人驚訝的是自然的行爲。

context.decodeAudioData(req.response, function(buffer){}); 

我對此做了一些研究,但是我只找到了將字符串轉換爲數組緩衝區的方法。 對於這種情況,我將音頻(如mp3格式)轉換爲arraybuffer,同時保持請求同步。 有沒有這方面的解決方法?

+0

也許這是不可能的。它甚至可能是有意的 - 強烈建議不要同步執行ajax。 – soktinpk 2014-12-02 02:41:26

+0

但我真的沒有看到它的傷害?它只是簡單的XMLHttpRequests並轉換成audioBuffer。 – user43353 2014-12-02 02:43:50

+0

危害正在做一個同步操作將掛起您的瀏覽器持續其等待期 - 包括分流任何目前呈現音頻 – 2014-12-02 18:46:11

回答

0

從標準方面來看。有傳聞說(儘管如此),同步請求將在未來的規範中被取消。新功能並不支持它。檢查this message

XMLHttpRequest2規範最近更改爲禁止在設置xhr.responseType時發送同步請求。

這裏的the spec

如果異步爲假,有一個相關的XMLHttpRequest的文件,要麼超時屬性值不爲零,withCredentials屬性值是true,或responseTyp的屬性值不是空字符串,拋出「InvalidAccessError」異常並終止這些步驟。

從應用程序端。使用ArrayBuffer通常意味着您請求的資源在某種程度上是一個大的二進制文件。雖然同步請求會阻止用戶界面,但這真是糟糕的用戶體驗。所以即使你可以這樣做,也不是一個好主意。

+0

嗯。我試圖在執行代碼之前先加載所有文件,因爲代碼依賴於這些文件。如果它在加載沒有完成之前得到執行,這些文件將以未定義的形式出現。 – user43353 2014-12-02 11:54:21

+0

@ user43353您可能需要一個資源管理工具,就像大多數HTML遊戲一樣。 – Leo 2014-12-02 12:07:03

相關問題