2016-06-15 3 views
0

Я хочу, чтобы иметь возможность установить функцию onbroadcast в SpeechRecognition после создания нового объекта SpeechRecognition, чтобы я мог вызвать эту функцию внутренне, если выполняются определенные условия.Установить внешнюю функцию объекта, которая может быть вызвана внутренне

Я хотел был бы иметь возможность установить его так же, как вы установили бы что-то вроде onerror в webkitSpeechRecognition. Когда я смотрю на onerror в Инструментах для разработчиков, похоже, что это может быть сделано через какой-то приемник/сеттер, как то, что описано here, но я не могу быть уверен.

Возможно ли это?

recognition.js:

var SpeechRecognition = function() { 
    var recognitionObject = new webkitSpeechRecognition(); 
    recognitionObject.onresult = function (event) { 
     if(event.results.length > 0) { 
      if (onbroadcast !== null && onbroadcast === 'function') { 
       onbroadcast('there are results'); 
      } 
     } 
    } 
    recognitionObject.onerror = function (event) { 
     console.log(event); 
    } 
    recognitionObject.onend = function (event) { 
     console.log(event); 
    } 
    recognitionObject.start(); 
} 

SpeechRecognition.prototype.onbroadcast = null; 

main.js:

var sr = new SpeechRecognition(); 
sr.onbroadcast = function(msg) { 
    document.getElementById('id') = msg; 
} 
+0

'onupdateraw' и' onbroadcast' являются необъявленными переменными, что вы имели в виду? Я предполагаю, что вы хотите ссылаться на свойство '.onbroadcast' ** вашего экземпляра' SpeechRecognition' - обычно с 'this' [но не в обратном вызове] (http://stackoverflow.com/q/20279484/1048572) как здесь. – Bergi

+0

Извините - 'onupdateraw' был опечаткой. – millarnui

+0

Я хочу установить 'onbroadcast' извне объекта каким-то образом, но назовите его изнутри (если он установлен) – millarnui

ответ

0

Вам необходимо обратиться к onbroadcast как property вашего экземпляра (this.onbroadcast). Он не волшебным образом становится доступным как переменная внутри области конструктора.

function SpeechRecognition() { 
    var self = this; // a reference to the instance 
    var recognitionObject = new webkitSpeechRecognition(); 
    recognitionObject.onresult = function (event) { 
     if (event.results.length > 0 && typeof self.onbroadcast === 'function') { 
      self.onbroadcast('there are results'); 
//   ^a property access 
     } 
    }; 
    recognitionObject.onerror = recognitionObject.onend = function (event) { 
     console.log(event); 
    }; 
    recognitionObject.start(); 
} 
+0

«self» - это зарезервированное слово @Bergi –

+0

Сразу после того, как я установил 'sr.broadcast' в main.js, я вижу, что свойство было установлено, но когда' registrationObject.onresult' запущен 'self.onbroadcast' === не определено. – millarnui

+0

@BekimBacaj: Нет, это не так. Это глобальная переменная ('window.self'), да, но не зарезервирована. – Bergi

Смежные вопросы