Você conhece o limite diferido e a recursão? Há um bom exemplo abaixo, você pode dar uma olhada
função runasynctts (text, discursor, audiopath) {var def = jquery.deferred (); var args = {"synthText": texto, "voicespeeCer": discursor, "wordspeed": "3", "usecssml": "0", "audiopath": audiopath}; tts.asynctts (json.stringify (args), function (err, resultado) {def.resolve (resultado);}); return def.promise (); } função textTospeechbat (metajson, discursor, audiopath) {var def = $ .deferred (); var resultado = {originalwords: "", resultadojsonarr: []}; var jsons = ""; for (var index = 0; index <metajson.words.length; index ++) {var Audioname = metajson.words [index] ['áudio']; 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 ['resultadojsonarr'] = ret.split ('|'); def.resolve (resultado);}); return def.promise (); } Função textTospeechwithTtryTimes (metajson, discursor, audiopata, horários) {var def = $ .deferred (); var ttsret = null; var tTsCallback = function (index) {if (index <times) {textToSpeechBat (metajson, discurso, audiopath) .Done (function (ret) {console.log ("textTospechwithTtryTimes:"+json.stringify (ret); tdRets; i = 0; i <resultadojsonr.length; i ++) {if (resultjsonarr [i] == "") {audioflag = false; RETOBJ [Resultado '] == "") {Audioflag = false; def.Resolve (ret);}}); } if (index == times) {console.log ("textTosPeechWithTyTimes Timestrover, retorno"); def.Resolve (ttsret); }}; ttsCallback (0); return def.promise (); }