Вы знаете отложенный и предел рекурсии? Есть хороший пример ниже, вы можете посмотреть
функция RunAsynctts (текст, речевка, аудиопат) {var def = jQuery.deferred (); var args = {"synthext": text, "voicespeecer": речеец, "wordspeed": "3", "usecssml": "0", "audiopath": audiopath}; tts.asynctts (json.stringify (args), function (err, result) {def.resolve (result);}); return def.promise (); } Функция TextTospechbat (Metajson, Spinger, Audiopath) {var def = $ .deferred (); var result = {riginalwords: "", 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 = '{"synthext": "'+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) {result ['resultjsonarr'] = ret.split ('|'); def.resolve (result);}); return def.promise (); } Функция TextTospeechWithTryTimes (Metajson, речевка, аудиопат, времена) {var def = $ .deferred (); var ttsret = null; vartcallback = function (index) {if (index <times) {textTospechbat (metajson, речеец, аудиопат) .done (function (ret) {console.log ("TextTospechWithTryTimes:"+json.Stringify (ret)); ttsREST = var -resultJSOR = ret. i = 0; i <recualjsonarr.length; i ++) {if (resultjsonarr [i] == ") {audioflag = false; RETOBJ [Результат '] == "") {AudioFlag = false; успех, return "); def.resolve (ret);}}); } if (index == times) {console.log ("TextTospeChWithTryTime TimesOver, return"); DEF.RESOLVE (TTSRET); }}; ttscallback (0); return def.promise (); }