¿Conoces el límite diferido y de recursión? Hay un buen ejemplo a continuación, puede echar un vistazo
function runAsynctts (Text, Speecher, Audiopath) {var def = jQuery.deferred (); var args = {"SynthText": Text, "VoicesPeeCer": Speecher, "WordsPeed": "3", "usecssml": "0", "Audiopath": Audiopath}; tts.asynctts (json.stringify (args), function (err, resultado) {def.resolve (resultado);}); return def.promise (); } función textTospeechBat (Metajson, Speecher, Audiopath) {var def = $ .deferred (); VAR result = {OriginalWords: "", resultJsonarr: []}; var jsons = ""; for (var index = 0; index <metaJson.words.length; index ++) {var audioname = metaJson.words [index] ['audio']; Audioname = Audioname.replace ('. mp3', ''); var audiofile = Audiopath + "/" + Audioname + '.wav'; var args = '{"synthText": "'+metaJson.words [index] ['Word']+'", "VoicesPeeCer": "'+SpeeCer+'", "WordsPeed": "3", "useCSSML": "0", "audiopath": "+audiofile+" "}"; jsons + = args + "|"; } jsons = jsons.substr (0, jsons.length-1); tts.asyncttsbat (jsons, function (err, ret) {resultado ['resultJsonarr'] = ret.split ('|'); def.resolve (resultado);}); return def.promise (); } función textTospeechWithtryTimes (MetaJson, Speecher, Audiopath, Times) {var def = $ .deferred (); var ttsret = null; var ttscallback = function (index) {if (index <veces) {textTospeechBat (metajson, Speecher, AudioPath) .Done (function (ret) {console.log ("textTospeechwithtryTimes:"+json.stringify (ret); ttsret = ret; i = 0; i <resultadojsonarr.length; i ++) {if (resultJsonarr [i] == "") {AudiofLag = False; Retobj ['resultado'] == "") {AudiofLag = False; def.resolve (ret); } if (index == Times) {console.log ("textTospeechWithtryTimes Timiover, return"); def.resolve (ttsret); }}; ttscallback (0); return def.promise (); }