2016-03-06 94 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(); 
}