2016-03-06 4 views
0

Я функции послефункция, возвращающая нуль в JavaScript

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

Функция loadAudioData (WAVFile) необходимо загрузить файл WAV с помощью Ajax и возвращать результат как 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) функционировать переменная аудиоданные получает значение, которое он должен получить, но тогда, когда он возвращается к функции calculateMFCC (WAVFile , clipID) значение audioData не определено, поэтому, когда он вызывает passToWavReader (audioData), скрипт прерывается. Таким образом, переменная audioData от calculateMFCC каким-то образом не получила значение от loadAudioData.

+1

Подсказка: какая функция является вашим оператором возврата внутри? – nnnnnn

+0

Используйте обещание https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise –

+0

** ** ** в async. Вы пытаетесь использовать значение перед возвратом вызова. Вы должны думать по-другому, когда используете асинхронные функции, независимо от того, связаны они или нет в других функциях, которые * выглядят * синхронно. –

ответ

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(); 
} 
Смежные вопросы