[英]How to loop over questions in Web Speech API
如何使用Web Speech API遍歷問題列表。 例如,我想問一系列“是”或“否”問題,然后如果答案為“是”,則以不同的方式處理結果,如果答案為“否”,則轉到下一個問題。
var questions = //array of five questions
function answerQuestions {
for (i = 0; questions.length; i++) {
if (askUser(questions[i]) {
///Do something if yes
} else if ((i+1) === questions.length){
//stop asking questions
}
}
function askUser (question) {
//instantiate Web Speech API
//someinstance.speak(question)
}
function say(m){
var msg = new SpeechSynthesisUtterance();
var voices = window.speechSynthesis.getVoices();
msg.voice = voices[10];
msg.voiceURI = "Google UK English Male";
msg.volume = 1;
msg.rate = 1;
msg.pitch = 1.4;
msg.text = m;
msg.lang = 'en-GB';
speechSynthesis.speak(msg);
msg.onend = function () {
listenToAnswer()
}
}
問題在於,它永遠不會調用listenToAnswer()並監聽下一個用戶輸入。 相反,它只是在問題的for循環中真正快速地循環。 任何想法將不勝感激。
首先, say
需要返回一個演講結束Promise
解決的Promise
。 這樣,您可以調用say()
並在for
循環中await
它。 當前,您正在pickQuestion
內部構造一個Promise
,但是隨后您要立即解決它,因為在Promise構造后立即調用了它的resolve
。 因此,沒有時間進行任何異步操作了。
一旦say
返回Promise
,您就可以避免在for
循環內構造另一個Promise
,而只需等待say
調用:
function say(m){
return new Promise((resolve) => {
const msg = new SpeechSynthesisUtterance();
var voices = window.speechSynthesis.getVoices();
msg.voice = voices[10];
msg.voiceURI = "Google UK English Male";
msg.volume = 1;
msg.rate = 1;
msg.pitch = 1.4;
msg.text = m;
msg.lang = 'en-GB';
speechSynthesis.speak(msg);
msg.onend = function () {
resolve()
}
});
}
async function pickQuestion(subject) {
const questionsOfSubject = questions[subject];
for (let i = 0; i < questionsOfSubject.length; i++) {
await say("Would you like to read, " + questionsOfSubject[i].title);
const answer = await listenToResponse();
if (answer.toLowerCase() === "yes") {
readQuestion();
break;
}
}
}
確保使用const
(或let
)聲明新變量,以免隱式分配給窗口屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.