Javascript:值不能通过条件传递,尽管它是真的



当我做一些事情时,我想出了一个奇怪的问题。我尝试进行语音识别。条件的第一部分工作正常,但第二部分不起作用。

var v;
function test() {
  var ses = new webkitSpeechRecognition();
  ses.lang = "En"
  ses.continuous = true;
  ses.start();
  ses.onresult = function(event)
    if (event.results.length > 0) {
      sonuc = event.results[event.results.length - 1];
      document.querySelector("input").value = sonuc[0].transcript;
      v = sonuc[0].transcript;
      console.log(v + " 1");
      if (v == "good") {
        switchLED('on');
        console.log(v + "2");
        console.log("OK !");
        console.log("LED ok");
      }
      if (v == "bad") {
        switchLED('off');
        console.log(v + "2");
        console.log("OK !");
        console.log("LED off");
      }
    }
  }

我第一次说:good结果是:

good 1 
good 2
OK ! 
LED OK

这是正确的。

然后,第二次如果我说:bad结果是:

bad 1

并且它没有经过if(v == "bad")的条件.

只有当bad是我说的第二个词时,才会发生这种情况。如果我刷新页面并在第一次直接说"不好",我会得到所有正确的结果。

根据Mozzila的文档:

对于连续识别,

将在必要时包含前导或尾随空格,以便连续的语音识别结果的串联生成会话的正确脚本。

这与您描述的完全匹配。由于您的语音识别会话是连续的(如ses.continuous = true所示(,因此当您第一次说任何单词时,转录器将正确获取单词。但是当它识别下一个单词时,将添加一个前导空格。您可能错误地复制了控制台输出,它必须是这样的:

good 1 
good 2
OK ! 
LED OK
 bad 1 
^ leading space here

确实," bad"不等于"bad".这就是字符串未通过条件的原因。要解决此问题,只需确保修剪字符串:

var v;
function test() {
  var ses = new webkitSpeechRecognition();
  ses.lang = "En"
  ses.continuous = true;
  ses.start();
  ses.onresult = function(event)
    if (event.results.length > 0) {
      sonuc = event.results[event.results.length - 1];
      document.querySelector("input").value = sonuc[0].transcript;
      v = sonuc[0].transcript.trim(); // <-- trim here
      console.log(v + " 1");
      if (v == "good") {
        switchLED('on');
        console.log(v + "2");
        console.log("OK !");
        console.log("LED ok");
      }
      if (v == "bad") {
        switchLED('off');
        console.log(v + "2");
        console.log("OK !");
        console.log("LED off");
      }
    }
  }

然后,您的代码应按预期工作。希望对您有所帮助!

最新更新