2016-03-06 97 views
0

返回null我有以下功能功能在javascript

function calculateMFCC (wavFile, clipID) { 
    var audioData = loadAudioData(wavFile); 
    clipId = clipID; 
    passToWavReader(audioData); 
} 

功能loadAudioData(wavFile)應該使用Ajax加載wav文件,並返回結果作爲arraybuffer。這是它的樣子:

function loadAudioData(wavFile) { 
    var request = new XMLHttpRequest(); 
    request.open('GET', wavFile, false); 
    //request.responseType = 'arraybuffer'; 
    request.onload = function() { 
     var audioData = stringToArrayBuffer(request.response); 
     //passToWavReader(audioData); 
     return audioData; 
    } 
    request.send(); 
} 

當我調試腳本,我看到,在loadAudioData(wavFile)函數中的變量audioData得到它應該得到的價值,但是當它返回到功能calculateMFCC(wavFile ,clipID)值audioData是未定義的,所以當它調用passToWavReader(audioData)時,腳本會中斷。所以,calculateMFCC的audioData變量不知道從loadAudioData得到了什麼值。

+1

提示:哪個函數是你的return語句裏面的? – nnnnnn

+0

使用承諾https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise –

+0

異步中的** A **。您正在嘗試在呼叫返回之前使用該值。當你使用異步函數時,你必須以不同的方式思考,不管它們是否包含在*看起來*同步的其他函數中。 –

回答

0

問題是XMLHttpRequest在一瞬間沒有響應。你需要添加一個回調。試試:

function calculateMFCC (wavFile, clipID) { 
    loadAudioData(wavFile, function(audioData) { 
    clipId = clipID; 
    passToWavReader(audioData); 
    }); 
} 

function loadAudioData(wavFile, callback) { 
    var request = new XMLHttpRequest(); 
    request.open('GET', wavFile, false); 
    //request.responseType = 'arraybuffer'; 
    request.onload = function() { 
    var audioData = stringToArrayBuffer(request.response); 
    //passToWavReader(audioData); 
    callback(audioData); 
    } 
    request.send(); 
}