0

这是我的代码

export class recognition {
  constructor() { }

  public startrecognition() {
    const voice_recognition = new webkitSpeechRecognition();
    voice_recognition.continuous = false;
    voice_recognition.interimresults = false;
    voice_recognition.lang = "en-US";

    voice_recognition.start();

    voice_recognition.onresult = function (e) {
      const repsonse = e.results[0][0].transcript;
      this.cust_response(response);
      voice_recognition.stop();
    }

    voice_recognition.onerror = function (e) {
      voice_recognition.stop();
    }
  }

  public cust_response(response) {
    //Some code here using response given by customer//
  }
}

这里的问题是我无法cust_response(response)voice_recognition.onresult.

编辑:我已将此 voice_recognition.onresult=function(event){} 更改为 voice_recognition.addEventListener("result",(event)=>{}) ,这正在调用其中的函数。但是随着这个改变,它有时会调用 voice_recognition.addEventListener("result",(event)=>{}) 并且当我再次运行时它没有调用这个函数,甚至它没有执行 voice_recognition.addEventListener("error",(event)= >{})。为什么相同的代码有时运行而其他时间不运行?

4

2 回答 2

0

您需要使用或箭头函数表示法来使用回调中的关键字bind(this)访问类成员变量。this

尝试以下

public startrecognition() {
  const voice_recognition = new webkitSpeechRecognition();
  voice_recognition.continuous = false;
  voice_recognition.interimresults = false;
  voice_recognition.lang = "en-US";

  voice_recognition.start();

  voice_recognition.onresult = (e) => {              // <-- arrow function
    const repsonse = e.results[0][0].transcript;
    this.cust_response(response);
    voice_recognition.stop();
  }

  voice_recognition.onerror = (e) => {
    voice_recognition.stop();
  }
}

您可以参考这里了解更多详情。

于 2020-11-03T07:14:37.060 回答
0

通过使用function关键字,您不会将上下文 ( this) 绑定到函数。

您应该:

  • (首选)使用箭头函数,它将绑定上下文例如:
voice_recognition.onresult = (e) => {
  ...
  this.cust_response(response);
}
  • 捕获this封闭范围内的变量并引用该变量,例如:
const self = this;

voice_recognition.onresult = function(e){
  ...
  self.cust_response(response);
}

参考:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

于 2020-11-03T07:15:43.547 回答