使用嵌套的if语句,如何退出最高级别?

时间:2014-03-26 10:22:47

标签: javascript html5 if-statement speech-recognition

我正在尝试使用HTML5语音识别API来记录我在屏幕上说的内容。我有一个关键字必须首先说明,以便其他单词被选中,所以它有点像Apple的Siri。当你说“好的,谷歌”时,它会再听两个单词,当它听到它们时,它会在屏幕上打印出来。代码的工作方式如下:

  • 听取“好的,谷歌”
  • 记录您已经听过的内容,并打开新功能寻找新单词
  • 如果您听到“15”或“30”,请将它们打印到屏幕
  • 当您听到“已完成”字样时,退出该功能,然后 if if语句。

当我只能退出第一个函数时,我无法退出两个if语句。当你说“完成”这个词时,你仍然可以说“15”或“30”并将它们打印到屏幕上,但我不希望你能说“完成”后将这两个数字打印到屏幕上。我想让你在说出这两个号码之前再说“好吧,谷歌”。

这是代码,我希望有人可以提供帮助。 提前谢谢。

recognition.onresult = function(event){
  var resultsLength = event.results.length -1 ;
  var ArrayLength = event.results[resultsLength].length -1;
  var Word = event.results[resultsLength][ArrayLength].transcript;
  console.log(Word);
  if (Word.indexOf('okay', 'google') != -1) {
    test.style.borderColor = "white";
    recognition.onresult = function(event){
      var resultsLength = event.results.length -1 ;
      var ArrayLength = event.results[resultsLength].length -1;
      var Word = event.results[resultsLength][ArrayLength].transcript;
      console.log(Word);
      document.getElementById('test').value = Word;
      if (Word.indexOf('15') != -1) {
        test.innerHTML = '15';
      }
      if (Word.indexOf('30') != -1) {
        test.innerHTML = '30';
      }
      if (Word.indexOf('finished') != -1) {
        test.style.borderColor = "black";
        return;
      }
    }
  }
}

2 个答案:

答案 0 :(得分:0)

在您发布的代码的第8行,您将处理函数分配给recognition.onresult:

recognition.onresult = function(event){
   // content removed
}

问题在于,当您听到"已完成"时,您根本不会删除或替换此处理程序。下次触发事件时,完全相同的处理程序再次启动并打印单词。

你需要做的是,当你听到"完成"这个词时,将onresult处理程序设置为其他东西:

if (Word.indexOf('finished') != -1) {
    recognition.onresult = function(event){
        // do something different now that we've heard "Finished"
    }
    test.style.borderColor = "black";
    return;
}

请注意,根据您的描述,您想要的是将初始函数(您在第1行中分配的整个代码)重新分配给处理程序。这开始变得非常复杂和困难,因为你现在处理两个匿名函数,一个嵌套在另一个中,并且你想从内部函数中分配外部函数。

在这种情况下,如果你打破这些匿名函数并给它们命名,你的代码将更容易阅读,这样你就可以重复地将它们分配/重新分配给recognition.onresult。

这绝不是一个完整的实现,我还没有对以下内容进行测试,但看看以下是否有意义:

recognition.onresult = listenForOkayGoogle;

function listenForOkayGoogle(event) {
   var Word = ...;
   if (Word.indexOf('okay', 'google') != -1) {
      recognition.onresult = listenForNumbersUntilFinished;
   }
}

function listenForNumbersUntilFinished(event) {
   var Word = ...;
   if (Word.indexOf('15') != -1) {
      // print it
   }
   if (Word.indexOf('30') != -1) {
      // print it
   }
   if (Word.indexOf('finished') != -1) {
      recognition.onresult = listenForOkayGoogle;
   }
}

首先,将listenForOkayGoogle指定为处理程序。每当事件被触发时,这个处理程序就会启动并检查是否已经说出了一个神奇的单词,如果是,它用listenForNumbersUntilFinished替换处理程序。现在,每次触发事件时,该处理程序都会启动。如果单词与相关数字之一匹配,则打印出来;如果它匹配单词' finished',则再次分配listenForOkayGoogle处理程序。您在此处使用Strategy Pattern生效。

答案 1 :(得分:0)

在嵌套'if'执行之前,'top-level if'已经完成。要解决您的问题,您不应该在收到'okay google'时设置新的事件处理程序。相反,你应该实现某种状态机。例如:

function setup(recognition) {
    var isListeningOkayGoogle = true;
    recognition.onresult = function(event) {
        var resultsLength = event.results.length -1 ;
        var ArrayLength = event.results[resultsLength].length -1;
        var Word = event.results[resultsLength][ArrayLength].transcript;
        console.log(Word);

        if (isListeningOkayGoogle) {
            if (Word.indexOf('okay', 'google') != -1) {
                test.style.borderColor = "white";
                isListeningOkayGoogle = false;
            }
        } else {
            document.getElementById('test').value = Word;
            if (Word.indexOf('15') != -1) {
                test.innerHTML = '15';
            }
            if (Word.indexOf('30') != -1) {
                test.innerHTML = '30';
            }
            if (Word.indexOf('finished') != -1) {
                test.style.borderColor = "black";
                isListeningOkayGoogle = true; // start listening 'Okay Google' again
            }
        }
    }
}