javascript Deferred和递归次数限制

function runAsyncTTS(text,speecher,audiopath) {
        var def = jQuery.Deferred();
        var args = {"SynthText": text, "VoiceSpeecher": speecher, "WordSpeed": "3", "UseCSSML": "0", "AudioPath": audiopath};

        tts.asyncTTS(JSON.stringify(args),function(err,result) {
            def.resolve(result);
        });

        return def.promise();
    }

function 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']+'", "VoiceSpeecher": "'+speecher+'", "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();
    }

function textToSpeechWithTryTimes(metaJson, speecher, audioPath,times) {
        var def = $.Deferred();
        var ttsRet = null;
        var ttsCallBack = function(index) {
            if(index < times) {
                textToSpeechBat(metaJson,speecher,audioPath).done(function (ret) {
                    console.log("textToSpeechWithTryTimes:"+JSON.stringify(ret));
                    ttsRet = ret;
                    var resultJsonArr = ret.resultJsonArr;
                    var audioFlag = true;
                    for(var i=0;i<resultJsonArr.length;i++) {
                        if(resultJsonArr[i] == "") {
                            audioFlag = false;
                            break;
                        }
                        var retObj = JSON.parse(resultJsonArr[i]);
                        console.log(retObj['audioFlag']);
                        if(retObj['audioFlag'] == 'false' || retObj['result']=="") {
                            audioFlag = false;
                            break;
                        }
                    }
                    console.log(audioFlag);
                    if(audioFlag == false) {
                        console.log("textToSpeechWithTryTimes Fail, try again!");
                        ttsCallBack(++index);
                    }else {
                        console.log("textToSpeechWithTryTimes succeed,return");
                        def.resolve(ret);
                    }
                });
            }

            if(index == times) {
                console.log("textToSpeechWithTryTimes timesover,return");
                def.resolve(ttsRet);
            }
        };

        ttsCallBack(0);
        return def.promise();
    }

你可能感兴趣的:(javascript Deferred和递归次数限制)