Я относительно новичок в JavaScript и в настоящее время работаю над проектом, который новичку, вероятно, не стоит начинать.Я некоторое время программировал на python и решил попробовать.Я пытаюсь сделать личного помощника, или, как мне нравится называть, Джарвиса (от IRON MAN).В настоящее время он может прослушивать команды и выполнять их очень хорошо, однако я пытаюсь создать команду send email
, которая требует многократного ввода от пользователя в одной функции.Эта функция отправки электронной почты технически находится в parseCommand()
, где я передаю идентификатор, известный как i.Со временем я добавлю больше команд к parseCommand()
, и идентификатор поможет узнать, какую команду выполнить.Когда я говорю, «Джарвис отправляет электронное письмо», parseCommand("email")
вызывается.Это обещание, потому что, как только это будет сделано, я хочу снова вызвать annyang (слушатель команд).
Когда запускается «jarvis send a email» ->
"jarvis send an email" : async function(){
annyang.abort(); // stop listening
await parseCommand("email").then(annyang.start()); // Start listening for another command when done
}
parseCommand:
parseCommand(i){
return new Promise(async (resolve) => {
recognition.stop();
if(i == "email"){
var SUBJECT;
var TEXT;
var TO;
console.log("Running: send an email")
await this.promptListen("Who shall I send it to?").then( async (email) =>{
TO = email;
console.log("got TO", TO)
await this.promptListen("What shall the subject be?").then( async (subject) => {
SUBJECT = subject;
console.log("got SUBJECT", SUBJECT)
await this.promptListen("What would you like to say?").then((text) => {
TEXT = text;
console.log("got TEXT", TEXT)
resolve()
})
})
});
}
})
}
Команда promptListen:
promptListen(prompt){
return new Promise((resolve, reject) => {
socket.emit("speak", prompt);
setTimeout(1000);
promptRecognition.stop(); // NOTE #1
promptRecognition.start();
promptRecognition.onresult = function(event){
console.log(event)
promptRecognition.stop();
resolve(event.results[0][0].transcript);
}
promptRecognition.onnomatch = function() {
promptRecognition.stop();
reject(promptListen(prompt));
}
})
}
Проблема с текущей функциональностью заключается в том, что она вообще не работает.Меня спрашивают: «Кому я отправлю это?»и Джарвис слушает.Я получаю вывод консоли TO, однако, после этого я получаю ошибку:
responses.js:63 Uncaught (in promise) DOMException: Failed to execute 'start' on 'SpeechRecognition': recognition has already started.
at Promise (http://localhost:3000/scripts/responses.js:63:31)
at new Promise (<anonymous>)
at Respond.promptListen (http://localhost:3000/scripts/responses.js:57:16)
at promptListen.then (http://localhost:3000/scripts/responses.js:41:28)
Ошибка предполагает, что я уже использую SpeechRecognition, однако я останавливаю его в начале promptListen()
каждый раз, когда простов случае.Я не знаю, что происходит вообще.Желаемым результатом будет то, что каждый вызов promptListen()
позволит мне подсказать пользователю, прослушать ответ, сохранить ответ в переменной: для каждой переменной, необходимой для отправки электронного письма (получатель, тема и тело),Я не знаком с JavaScript, обещаниями, асинхронностью или ожиданием.Я перепробовал все возможные варианты, а также просмотрел документацию безрезультатно.Если я не использую обещания, функция promptListen()
вызывается одновременно для приглашений получателя, субъекта и тела.Вот почему я решил попытаться решить проблему с обещаниями.Любая помощь приветствуется - спасибо!