Установка состояния webkitspeechRecognition и изменение языка - PullRequest
0 голосов
/ 25 августа 2018

Итак, я установил

let recognition = new SpeechRecognition;
recognition.continuous = true;
recognition.interimResults = false;
recognition.lang = 'en-US';

this.setState({
    recognition
});

console.log(this.state.recognition) дает мне объект распознавания речи. поскольку я не должен напрямую изменять состояние с помощью this.state.recognition.lang = 'ja-JP', я пытаюсь создать новый объект, чтобы установить состояние распознавания:

let newObject = {...this.state.recognition, lang: 'ja-JP'}

Однако console.log(newObject) возвращает { lang: 'ja-JP' }, а остальные свойства не клонируются.

Это проблема с API webkitspeechrecognition и есть ли обходной путь, чтобы заставить его работать?

1 Ответ

0 голосов
/ 25 августа 2018

Оператор распространения объекта (...) возвращает перечисляемые свойства Object в виде пар ключ-значение. Но не все типы, которые наследуются от прототипа Object, имеют перечисляемые свойства, и похоже, что родной тип SpeechRecognition является одним из них - здесь нет итеративных ключей, только неперечислимые атрибуты. (Таким образом, ...(new SpeechRecognition) даже не выдает ошибку; он покорно возвратил нулевые перечислимые свойства recognition. На самом деле это не так уж удивительно, есть много встроенных типов объектов Javascript, которые не имеют перечислимых свойства.)

Я думаю, вам нужно будет создать new SpeechRecognition экземпляр с желаемым recognition.lang = 'ja-JP', а затем setState для этого. Я не знаю ни одного метода распространения или .assign(), который создает новые экземпляры SpeechRecognition из старых. Я вижу, как это может создать ситуацию, в которой есть несколько SpeechRecognition экземпляров, для которых браузер выделяет память; вам может потребоваться проявить творческий подход и delete ссылку на старый экземпляр SpeechRecognition после завершения setState, чтобы сборщик мусора мог выполнить свою работу и оставить вам только один экземпляр.

...