speechSynthesis.getVoices() returns Windows 上的空数组

speechSynthesis.getVoices() returns empty array on Windows

我正在制作一个 Chrome 扩展,我在其中使用了语音合成。当我在 控制台 中键入 speechSynthesis.getVoices() 时,我得到一个 21 种不同声音的数组 。伟大的!

当我 console.log() 我的 javascript 代码中的同一行时,我在控制台中得到一个 空数组 。怎么回事,想不通!

正如@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 数组是否为空。如果不是,我们最终会兑现承诺...