我正在制作一个Chrome扩展程序,其中我使用了语音合成技术。当我在控制台中输入speechSynthesis.getVoices()
时,会显示21种不同的语音。非常好!
但是,在我的JavaScript代码中使用console.log()
打印同样的代码时,控制台返回一个空数组。我无法弄清楚问题出在哪里!
我正在制作一个Chrome扩展程序,其中我使用了语音合成技术。当我在控制台中输入speechSynthesis.getVoices()
时,会显示21种不同的语音。非常好!
但是,在我的JavaScript代码中使用console.log()
打印同样的代码时,控制台返回一个空数组。我无法弄清楚问题出在哪里!
正如评论中的 @CertainPerformance 所指出的那样,当页面加载时,由于异步操作,需要一定时间来填充声音数组。因此,当页面加载后立即将数组记录到控制台时,我们会看到一个空数组...
为了解决这个问题,我们可以在一定时间(比如10或50毫秒)之后将其记录到控制台:
setTimeout(() => {
console.log(window.speechSynthesis.getVoices());
}, <time_in_ms>);
如果你想使用Promises
实现相同的功能,那么这就是代码:
function setSpeech() {
return new Promise(
function (resolve, reject) {
let synth = window.speechSynthesis;
let id;
id = setInterval(() => {
if (synth.getVoices().length !== 0) {
resolve(synth.getVoices());
clearInterval(id);
}
}, 10);
}
)
}
let s = setSpeech();
s.then((voices) => console.log(voices)); // Or any other actions you want to take...
在这里,每个时间间隔后,我们检查getVoices()
返回的voices数组是否为空。如果不是,我们最终会解析该承诺(promise)...
onvoiceschanged
事件,而不是像@Plokko所描述的使用setInterval。另请参见https://dev59.com/jGEi5IYBdhLWcg3wMp9y - Jezzamon
function set_up_speech() { return new Promise(function(resolve, reject) { var synth = window.speechSynthesis; var voices = synth.getVoices(); resolve(voices) }) }
调用方式为set_up_speech().then(function(voices) { console.log(voices) });
- user1063287